2017-06-01 101 views
0

在此article中,它顯示了我們如何在lambda表達式中組合多個列。但是它返回一個IEnumerable<IEnumerable<TSource>>,這不是我想要實現的結果。將GroupBy用於多列和返回列表<TSource>

我創建了一個包含幾個屬性的類。現在

internal class Class1 
{ 
    internal string prop1 { get; set; } 
    internal string prop2 { get; set; } 
    internal decimal? prop3 { get; set; } 
} 

,如果我創建了以下lambda表達式,它返回一個IQueryable<IEnumerable<Class1>> listClass1

var listClass1 = context.Table1 
    .Join(context.Table2, 
      t1 => t1.Id, 
      t2 => t2.Table1Id, 
      (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .GroupBy(data => new 
    { 
     data.t1.Column1, 
     data.t2.Column2, 
    }) 
    .Select(data => data.Select(x => new Class1 
    { 
     prop1 = x.t1.Column1, 
     prop2 = x.t2.Column2, 
     prop3 = x.t1.Column3 
    })); 

但我想有一個List<Class1> listClass1,因爲我打算使用foreach遍歷每個元素在列表中。這可能嗎?

回答

0

然後你不應該使用GroupBy()GroupBy()的目標是將單個項目列表拆分爲多個項目列表。
項目的分配基於相同的鍵值進行。在你的情況下,密鑰由多個列組成,但原則保持不變。

SelectMany()GroupBy()相反。它從多個不同的列表中創建一個列表。

您的問題的直接答案是,您應該將Select()更改爲SelectMany()。這正是你想要的。


但這不是你的情況的最佳解決方案。完成GroupBy().SelectMany()完全沒有意義,因爲這些操作取消了彼此!

var listClass1 = context.Table1 
    .Join(context.Table2, 
     t1 => t1.Id, 
     t2 => t2.Table1Id, 
     (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .Select(x => new Class1 
     { 
      prop1 = x.t1.Column1, 
      prop2 = x.t2.Column2, 
      prop3 = x.t1.Column3 
     }); 

編輯從下面的評論,我可以看到你正在使用一組被作爲一種方式來獲得不同的值(即完全等於沒有雙行)

這可以

var listClass1 = context.Table1 
    .Join(context.Table2, 
     t1 => t1.Id, 
     t2 => t2.Table1Id, 
     (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .Distinct() //filters out all the double entries 
    .Select(x => new Class1 
     { 
      prop1 = x.t1.Column1, 
      prop2 = x.t2.Column2, 
      prop3 = x.t1.Column3 
     }); 

I refer you to this SO question that addresses when to use DISTINCT or GROUP BY.
的PRINC:通過使用Distinct()方法來進行對於SQL和LINQ,iple是相同的,因爲LINQ試圖模擬SQL如何工作。

+0

那麼如何將以下SQL語句轉換爲lambda表達式?這個查詢中的結果是我試圖實現的結果。 'SELECT t1.Column1,t2.Column2,t1.Column3 FROM dbo.Table1 T1 \t INNER JOIN dbo.Table2 T2 ON t1.Id = t2.Table1Id WHERE - 有些表達式 GROUP BY t1.Column1, t2.Column2,t1.Column3' –

+2

'SELECT t1.Column1,t2.Column2,t1.Column3 ... GROUP BY t1.Column1,t2.Column2,t1.Column3'在功能上等同於'SELECT DISTINCT t1.Column1, t2.Column2,t1.Column3 ...'如果你真的想要使用聚合函數,你應該只使用分組**,例如**計算每個城市有多少人會選擇'Select CityName,Count(*)從城市名稱的公民組。您不調用聚合函數,因此不需要使用group by。 – Flater

+0

您編輯的答案解決了我的問題!所以現在我清楚這兩者之間的區別。我應該用DISTINCT代替。謝謝!我會將其標記爲答案。 –