2015-04-29 40 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',将所有内容加载到内存中都不是一个可行的选项。 –