C# 基于表架构生成一个类
我想根据用户提交的查询结果动态生成一个类。例如,如果用户输入Select name,age from tbl,则结果是一个名称列,该列为字符串,age为int。生成的类应为:C# 基于表架构生成一个类,c#,sql-server,entity-framework,reflection,C#,Sql Server,Entity Framework,Reflection,我想根据用户提交的查询结果动态生成一个类。例如,如果用户输入Select name,age from tbl,则结果是一个名称列,该列为字符串,age为int。生成的类应为: public class Test { public string Name { get; set; } public int Age { get; set; } } 是否有一种有效的方法通过EntityFramework或C中的特性来实现这一点,或者我必须使用反射来创建一个新类型并实例化它 PS:我的目的是
public class Test
{
public string Name { get; set; }
public int Age { get; set; }
}
是否有一种有效的方法通过EntityFramework或C中的特性来实现这一点,或者我必须使用反射来创建一个新类型并实例化它
PS:我的目的是在数据库上运行此查询,并在网格中向用户显示结果,并在其上运行一些筛选/排序等。您可以使用TypeBuilder创建一个新类型,并使用EF的SqlQuery对数据库执行查询,如前所述 或 更干净的方法是使用动态对象绑定网格。扩展EF以返回所建议的动态对象集合。代码是在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