2017-10-14 32 views
0

我有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(); 

我怎样才能做到这一点?

+0

威尔扩展方法如果显示一些示例数据并输出,则更容易理解 –

+0

由于您在运行时动态构建查询,因此需要动态构建表达式树。你可以用这个库来帮忙:https://dynamiclinq.codeplex.com/documentation –

+0

@Gilad Green我加了一些信息 – Karamafrooz

回答

1

由于您在运行时动态构建查询,因此需要动态构建表达式树。你可以使用这个库,以帮助是: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