IQueryable:在运行时动态地按 linq 中的名称投影列
IQueryable: Project columns by their names in linq dynamically at runtime
我有一个 Dictionary<string, string> Fields
,其中包含 属性Names 和 属性 Types。
我有一个查询对象:IQueryable<T> query = GetQuery();
我正在使用 Typebuilder 根据 Fields 字典动态构建类型:
TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType");
DataTable dt = new DataTable();
foreach (var s in Fields)
{
CreateAutoImplementedProperty(builder, s.Key, Type.GetType(s.Value));
dt.Columns.Add(s.Key, Type.GetType(s.Value));
}
Type resultType = builder.CreateType();
我想使用 linq
修改查询对象以仅投影其名称在 Fields
字典中的列。类似于:
dynamic queryResult = query.Take(10).Select("Don't know how to project here???");
考虑列名是:
string[] columnsNames = Fields.Select(x => x.Key).ToArray();
我该怎么做?
因为您在 运行 时动态构建查询,所以您需要动态构建 表达式树 。你可以使用这个库来帮助解决这个问题:https://dynamiclinq.codeplex.com/
在您的情况下,您可以像这样动态构建 .Select
子句:
string[] columnsNames = Fields.Select(x => x.Key).ToArray();
string columns = string.Join(",", columnsNames);
dynamic queryResult = query.Take(10).Select("new (" + columns + ")");
上面的.Select
是那个库的扩展方法
我有一个 Dictionary<string, string> Fields
,其中包含 属性Names 和 属性 Types。
我有一个查询对象:IQueryable<T> query = GetQuery();
我正在使用 Typebuilder 根据 Fields 字典动态构建类型:
TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType");
DataTable dt = new DataTable();
foreach (var s in Fields)
{
CreateAutoImplementedProperty(builder, s.Key, Type.GetType(s.Value));
dt.Columns.Add(s.Key, Type.GetType(s.Value));
}
Type resultType = builder.CreateType();
我想使用 linq
修改查询对象以仅投影其名称在 Fields
字典中的列。类似于:
dynamic queryResult = query.Take(10).Select("Don't know how to project here???");
考虑列名是:
string[] columnsNames = Fields.Select(x => x.Key).ToArray();
我该怎么做?
因为您在 运行 时动态构建查询,所以您需要动态构建 表达式树 。你可以使用这个库来帮助解决这个问题:https://dynamiclinq.codeplex.com/
在您的情况下,您可以像这样动态构建 .Select
子句:
string[] columnsNames = Fields.Select(x => x.Key).ToArray();
string columns = string.Join(",", columnsNames);
dynamic queryResult = query.Take(10).Select("new (" + columns + ")");
上面的.Select
是那个库的扩展方法