2016-08-18 66 views
1

我做了一個簡單的Linq查詢:動態的LINQ選擇一個複雜的對象

var retVal = readModel 
    .GroupBy(x => x.Service) 
    .Select(
     grp => new GroupView 
     { 
      GroupName = grp.Key, 
      GroupItems = grp.Sum(k => k.NumberOfItems) 
     } 
    ); 

retVal是一個IQueryable<GroupView>。到目前爲止,我試圖做的是使這個查詢變爲動態的,所以用戶可以使用自定義分組策略。

這是我第一次嘗試:

var retVal = readModel 
    .GroupBy("Service", "it") 
    .Select("it.key"); 

這給我字符串的含氧基團的名稱的數組。這是好的,但我想達到的效果是很遠,因爲我有兩個unanswerd問題:

  • 我怎麼能翻譯結果向GroupView模型
  • 我怎麼能作出這樣的總和?
+0

什麼是'GroupName'的類型?一個字符串?你會一直由這種類型的財產分組嗎?例如串? –

+0

是的,在這種情況下,它是一個字符串,但它也可能是一個Date,但現在一個字符串就足夠了。 –

+3

爲什麼不使用第一個代碼,而是用'Expression >'類型的變量替換'x => x.Service',其中'Entity'是您的實體類型? –

回答

0

事情是DynamicLinq不允許它簡單。

如果要擴展DynamicLinq庫以返回強類型結果,您可以檢查this answer

但是,如果你不想在這裏是一個簡單的解決辦法:

//select your grouped results 
var retVal = readModel 
     .GroupBy("Service", "it") 
     .Select("new (it.key as GroupName, Sum(it.NumberOfItems) as GroupItems)"); 

//Map them 
var res = ((IEnumerable<dynamic>)retVal) 
      .Select(x => new GroupView 
       { 
        GroupName = x.GroupName, 
        GroupItems = x.GroupItems 
       });