none
一个LINQ的简单问题。。。 RRS feed

  • 问题

  • 数据库使用的是罗斯文示例数据库。 按国家显示最畅销的产品(最畅销:我的理解是销售额最大的)。

    O/R图

    我写的代码仅能实现查询 按国家销售的产品

     northWindDataContext northWind = new northWindDataContext();
    
                var queryResult = from customer in northWind.Customers
                                  from order_detail in northWind.Order_Details
                                  where customer.CustomerID == order_detail.Order.CustomerID
                                  select new
                                  {
                                      country = customer.Country,
                                      sale = order_detail.Quantity * order_detail.UnitPrice,
                                      produceName = order_detail.Product.ProductName
                                  };
                var groupResult = from query in queryResult
                                  group query by new { country = query.country, product = query.produceName } into cg
                                  select new
                                  {
                                      country = cg.Key.country,
                                      product = cg.Key.product,
                                      sales = cg.Sum(o => o.sale)
                                  };
                var result = from query in groupResult
                             orderby query.country, query.sales descending
                             select query;
                foreach(var item in result)
                    Console.WriteLine(item);                    
                Console.ReadKey();
    
    2011年12月18日 12:22

答案

  •             var result = from query in groupResult
                             orderby query.country, query.sales descending
                             select query;
    
    好吧, 我还是自己写了这些类...
    其实你最后就差一点点了,把你的groupResult按Country分组,再在每个group里面查找sales最大的记录,然后返回的时候返回Country名和这条记录的Product名即可. 上面引用的query改成如下就可以了:
                var result = from query in groupResult
                             group query by query.country into finalGroup
                             select new { Country = finalGroup.Key, BestSellingProduct = finalGroup.OrderByDescending(i => i.sales).First().product };
    

    我是为了写起来方便, 你懂的... 当然可以把这些扩展方法换成linq语法.

    祝你快乐每一天, 

    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us

    2011年12月22日 16:02
    版主

全部回复

  • Hi Jone,

    我这边有NorthWind数据库, 如果你是linq to sql的话可否提供一下你用到的northWindDataContext类以及各个模型类的定义来方便这里的朋友帮你解决问题?
    祝你快乐每一天,
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月22日 7:09
    版主
  •             var result = from query in groupResult
                             orderby query.country, query.sales descending
                             select query;
    
    好吧, 我还是自己写了这些类...
    其实你最后就差一点点了,把你的groupResult按Country分组,再在每个group里面查找sales最大的记录,然后返回的时候返回Country名和这条记录的Product名即可. 上面引用的query改成如下就可以了:
                var result = from query in groupResult
                             group query by query.country into finalGroup
                             select new { Country = finalGroup.Key, BestSellingProduct = finalGroup.OrderByDescending(i => i.sales).First().product };
    

    我是为了写起来方便, 你懂的... 当然可以把这些扩展方法换成linq语法.

    祝你快乐每一天, 

    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us

    2011年12月22日 16:02
    版主
  • Hi,Leo

    谢谢你,由于这两天忙没有来的及查看MSDN,对于没有能够提供northWindDataContext类感到十分的抱歉。

    2011年12月24日 1:30