IQueryable:在运行时动态地在linq中按名称列出项目列
问题描述:
我有Dictionary<string, string> Fields
,其中包含属性名称和属性类型。IQueryable:在运行时动态地在linq中按名称列出项目列
,我有一个查询对象:IQueryable<T> query = GetQuery();
我使用Typebuilder建立一种动态的根据领域字典:
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
是从图书馆
+1
非常感谢。作品很棒+1 – Karamafrooz
威尔扩展方法如果显示一些示例数据并输出,则更容易理解 –
由于您在运行时动态构建查询,因此需要动态构建表达式树。你可以用这个库来帮忙:https://dynamiclinq.codeplex.com/documentation –
@Gilad Green我加了一些信息 – Karamafrooz