C# 基于表架构生成一个类

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:我的目的是

我想根据用户提交的查询结果动态生成一个类。例如,如果用户输入Select name,age from tbl,则结果是一个名称列,该列为字符串,age为int。生成的类应为:

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