2012-09-03 53 views
12

请帮我开始使用LINQ和GROUP和SUM进行查询。用GROUP和SUM进行LINQ查询

// Query the database 
IEnumerable<BestSeller> best_sellers = from bs in (db.MYDATABASE).Take(25) 
             where bs.COMPANY == "MY COMPANY" 
             group bs by bs.PRODCODE into g 
             orderby g.Sum(g.MQTY) 
             select new BestSeller() 
             { 
              product_code = , 
              product_description = , 
              total_quantity = 
             }; 

我想:

  • 通过bs.PRODCODE由总和为每个BS
  • 定购
  • 集团所有结果取前25名的项目从db.MYDATABASE。 PRODCODE
  • 公司是“我的公司”
  • 然后将数据输入到我的BestSeller()对象

我很困惑,因为只要我将group添加到混合中,我的bs变量就变得无用了。

回答

31

我很困惑,因为只要我将我的群组加入到混音中,我的bs变量就变得毫无用处。

是的,因为你不再有一个单一的项目 - 你现在处理组项目的序列。您可以先为每个组获得第一个项目,我认为这是获取描述的有效方法?

var query = from bs in db.MYDATABASE.Take(25) 
      where bs.COMPANY == "MY COMPANY" 
      group bs by bs.PRODCODE into g 
      orderby g.Sum(x => x.MQTY) 
      select new BestSeller 
      { 
       product_code = g.Key, 
       product_description = g.First().DESCRIPTION, 
       total_quantity = g.Sum(x => x.MQTY) 
      }; 

请注意,没有指定排序,“db.MYDATABASE的前25项”是没有意义的。 “顶部”以什么方式?你可能想要:

from bs in db.MYDATABASE.OrderByDescending(x => x.Price).Take(25) 

或类似的东西。请注意,如果这些公司中没有一家拥有“我的公司”,那么您最终将无法获得结果...

或者如果您希望排名前25位的畅销书,则最终需要“采取”部分:

var query = from bs in db.MYDATABASE 
      where bs.COMPANY == "MY COMPANY" 
      group bs by bs.PRODCODE into g 
      orderby g.Sum(x => x.MQTY) descending 
      select new BestSeller 
      { 
       product_code = g.Key, 
       product_description = g.First().DESCRIPTION, 
       total_quantity = g.Sum(x => x.MQTY) 
      }; 
var top25 = query.Take(25); 
+4

这条线真的有效吗? 'product_description = g.Key.DESCRIPTION' –

+1

应该是'g.Key'(对于product_code)和'g.First()。我想这是product_description的描述。 –

+0

请问为什么'g.Sum()'函数中使用'x'? – Luke