2010-02-26 95 views
1

我有一个标准的商店架构与包含产品的InvoiceLine表。我希望以销售列表的形式列出前5名产品。最干净的方法是什么?这不可能是最好的方法:最受欢迎GroupBy与Linq实体

private List<Product> GetTopProducts(int count) 
    { 
     var topProducts = from invoiceLine in storeDB.InvoiceLines 
         group invoiceLine by invoiceLine.ProductId into grouping 
         orderby grouping.Count() descending 
         select new 
         { 
          Products = from Product in storeDB.Products 
          where grouping.Key == Product.ProductId 
          select Product 
         }; 
     return topProducts.AsEnumerable().Cast<Product>().Take(count).ToList<Product>(); 
    } 
+0

您的模型中有可见的FK,Jon?您没有,例如InvoiceLine.Product生成的属性? – 2010-02-26 00:45:28

+0

我确实有一个InvoiceLine.Product。谢谢。那么返回它们最干净的方法是什么? – 2010-02-26 00:54:15

回答

1

我不能完全测试这个,但你可以简单地组生成的“产品”属性?

return (from i in storeDB.InvoiceLines 
        group i by i.Product into g 
        orderby g.Count() descending 
        select g.Key) 
    .Take(count).ToList(); 
+0

谢谢。我总是忘记你可以在生成的属性而不是ID字段上进行分组。 – 2010-02-26 01:19:23

1

清洁仍然通过在设计器中添加产品和InvoiceLine之间的关系 - 创建Product.InvoiceLines属性。

List<Product> result = storeDB.Products 
    .OrderByDescending(p => p.InvoiceLines.Count()) 
    .Take(count) 
    .ToList(); 
+0

谢谢,这更好! – 2010-02-26 18:38:50