2010-02-26 138 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