2015-04-29 71 views
0

我使用LINQ掙扎,因此它是一個蹩腳的問題,但仍.. 我有以下4列如何計算linq to sql中多個不同的列?

Pid SKU colorid sizeid 
1  'A65102' 38  2 
2  'A65102' 38  4 
3  'A65102' 38  18 

我一定要得到的顏色和大小的選擇多少不同可用於這樣的表。

在SQL中,我用做:

select count(distinct [sizeid]) ,count(distinct [colors]) 
from [item_master] 
where sku = 'A65102' 

但在LINQ中,我可以通過

var dd = (from im in db.item_masters 
      where im.sku.Contains("A65102") 
      select new {im.sizeid,im.colors }); 

得到所有的值,但我怎麼能得到不同值的計數在單個查詢中?

回答

3

你可以使用GroupBy

var distinctCounts = db.item_masters.GroupBy(im => im.sku) 
    .Where(grp => grp.Key == "A65102") 
    .Select(grp => new { 
     CntSizes = grp.Select(im => im.sizeid).Distinct().Count(), 
     CntColors = grp.Select(im => im.colorid).Distinct().Count() 
    }); 
+0

這裏的關鍵是什麼。在哪裏(grp => grp.Key ==「A65102」)休息我可以理解。你的回答是寫出正確的結果,但請詳細說明,以便我瞭解它是如何實現的。 – Ratna

+0

@Ratna:'Enumerable.GroupBy'返回一個'IEnumerable >',它有一個屬性'Key',映射到你用於分組的屬性,在本例中爲'sku'。該組可以包含多個記錄,但它們都共享相同的組密鑰「A65102」。您也可以使用其他方式:'Where(im => im.sku ==「A65102」)。GroupBy(im => im.sku)' –

2

您可以使用您有一個數據源檢索該數據的查詢(尤其是有用的,如果你想以後用它來做其他事情也一樣):

var dd = (from im in db.item_masters 
      where im.sku == "A65102" 
      select new {im.sizeid, im.colors}).ToList(); 

var numDistinctSizes = dd.Select(x => x.sizeid).Distinct().Count(); 
var numDistinctColors = dd.Select(x => x.colors).Distinct().Count(); 
+0

雖然在這種情況下工作,因爲結果集似乎很小,並沒有真正回答如何在數據庫中這樣做的問題。您需要兩個查詢而不是一個,都使用Linq-To-Object來查詢內存中的集合。沒有'Where',將所有內容加載到內存中都不是一個可行的選項。 –