2017-10-14 64 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