2017-08-27 71 views
1

我想根據用戶提交的查詢結果動態生成類。例如,如果用戶輸入Select name, age from tbl,則結果是name列,其爲stringage,它是int。生成的類應該是:根據表模式生成類

public class Test 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

是否有一個有效的方式通過EntityFramework或功能在C#中做到這一點還是我必須使用也許反射來創建一個新的類型和對其進行實例化。

PS:我的目的是在數據庫上運行這個查詢,並在網格中向用戶顯示結果並運行一些過濾/排序等。在上面。

回答

1

您可以使用TypeBuilder創建新類型,並使用EF的SqlQuery()對數據庫執行查詢,如here所述。

OR

的清潔器的方法將是使用dynamic對象與網格結合。按照ChristineBoersenhere的建議延長EF返回dynamic對象的集合。代碼是在EF進入RTM之前編寫的。這裏是可用的版本:

public static class EFExtensions 
{ 
    public static IEnumerable<dynamic> CollectionFromSql(this DbContext dbContext, string Sql, Dictionary<string, object> Parameters) 
    { 
     using (var cmd = dbContext.Database.Connection.CreateCommand()) 
     { 
      cmd.CommandText = Sql; 
      if (cmd.Connection.State != ConnectionState.Open) 
       cmd.Connection.Open(); 

      foreach (KeyValuePair<string, object> param in Parameters) 
      { 
       DbParameter dbParameter = cmd.CreateParameter(); 
       dbParameter.ParameterName = param.Key; 
       dbParameter.Value = param.Value; 
       cmd.Parameters.Add(dbParameter); 
      } 

      //var retObject = new List<dynamic>(); 
      using (var dataReader = cmd.ExecuteReader()) 
      { 
       while (dataReader.Read()) 
       { 
        var dataRow = GetDataRow(dataReader); 
        yield return dataRow; 
       } 
      } 
     } 
    } 

    private static dynamic GetDataRow(DbDataReader dataReader) 
    { 
     var dataRow = new ExpandoObject() as IDictionary<string, object>; 
     for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++) 
      dataRow.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]); 
     return dataRow; 
    } 
} 

你可以調用上面的方法如下:

var results = context.CollectionFromSql("Select Name, Age from tbl", new Dictionary<string, object>()).ToList(); 
// Bind results to grid