2017-08-27 34 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