2012-08-07 41 views
0

我有两个int值的形式的项目列表,名为basketId,ProductNameId,它们已被选中并保留。例如{{1,1} {1,2},{1,3}}到一些上层basketId {{n,2} {n,6},{n,6},{n,6},{ N,7},{N,8}}。篮子的数量会有所不同,每个篮子的入场数量可能会有所不同。LINQ组合并获得不同的最大发生次数

我需要输出的形式为ProductNameId和Max Count,用于存在于所有篮子集合中的每个ID。对于上面显示的这两个,这将是: 1,1,2,1,3,1,6,3,7,1,8,1,

我有以下代码,它的工作原理,但它看起来很丑陋,啰嗦,所以我要求一点帮助,想出一个更好的方法/更简洁 - 也许单一的陈述,也是如此。

// Get all the baskets that have been saved 
var baskets = Baskets.Where(x => x.MarketId == 1); 

// Group and get count for each product in each basket 
var counts = from q1 in all 
group q1 by new 
{ 
    q1.ProductNameId, 
    q1.BasketId 
} 
into g 
select new 
{ 
    ProductNameId = g.Key.ProductNameId, 
    Count = g.Count() 
}; 

// Group products and find the Maximum count that exists 
var max = from q2 in counts 
group q2 by q2.ProductNameId 
into g 
select new 
{ 
    ProductNameId = g.Key, 
    Max = g.Max (x => x.Count) 
}; 

// The distinct set of values present 
var distinct = max.Distinct(); 
+0

你能澄清你的数据吗?它基本上是'List '哪里篮子有'ProductNameId'和'BasketId'两个整数?而且,如果是这样,一些示例数据是什么样的,你想从中得到什么? – 2012-08-07 14:01:54

+0

因此,例如,如果你有这样的:{{ 1,1}, {1,2}, {1,3}, {1,2}, {1,3},{ 2,2 }, {2,3}, {1,4}, {1,5} }你会期待这个结果:? {ProductNameId = 1,Max = 1},{ProductNameId = 2,Max = 3},{ProductNameId = 3,Max = 3},{ProductNameId = 4,Max = 1},{ProductNameId = 5,Max = 1}, – eburgos 2012-08-07 14:09:14

+0

篮子基本上是一个有两列的产品,BasketId(购物篮有内容)和ProductNameId(产品类型已被购买)。在任何一天中都有数百个独特的BasketId记录,并且对于每个不同的BasketId值,通常有5到50个ProductNameId值。当客户购买多种相同产品类型时,其中一些值会出现一次以上。他们可以例如购买两种不同的麦片或糖果,篮子将包含两个记录 – 2012-08-09 04:33:35

回答

0

基础数据还是有点神秘的给我,但你的代码看起来像,我相信你正在试图做到这一点:

// Get all the baskets that have been saved 
var baskets = Baskets.Where(x => x.MarketId == 1); 

// Group and get count for each product in each basket 
var distinct = from q1 in baskets 
    group q1 by q1.ProductNameId into g 
    select new 
    { 
     ProductNameId = g.Key, 
     Max = (from q2 in g 
      group q2.BasketId by q2.BasketId).Max (x => x.Count()) 
    }; 
+0

感谢布拉德,那确实是... – 2012-08-09 04:34:51

0

这里做一个非常直接的方式它:

var query = 
    baskets 
     .ToLookup(b => b.ProductNameId) 
     .Select(l => new 
     { 
      ProductNameId = l.Key, 
      Max = l.Count(), 
     }); 
+0

对不起,但是这不能正常工作。此处生成的最大值实际上包含处理的所有篮子中ProductNameId的计数。当我在样本上运行它时,生成的最大值是132个产品,其中productNameId == 1,它是所有篮子中ProductNameId == 1值的总数。任何一个篮子中存在的ProductNameId == 1的实际最大数量是3.我需要此值而不是所有篮子中存在的计数。 – 2012-08-13 06:31:30