2009-09-07 62 views
6

我想抓住10個最常訂購的產品。我的表看起來與此類似:Linq to SQL:獲得排名前10位的產品

產品
ProductID | ProductName

OrderedProduct
ProductID | OrderID

訂購
OrderID | DateOrdered

目前我有以下幾點:

return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     select product).OrderByDescending(???).Distinct().Take(10); 

我在上面的查詢中注意到我不確定要放什麼。如何通過訂購產品表中顯示的產品數量來訂購?

+0

你會發現這個問題非常有用: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql – 2009-09-07 00:42:56

回答

16
return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     group orderedProduct by product into productGroups 
     select new 
     { 
       product = productGroups.Key, 
       numberOfOrders = productGroups.Count() 
     } 
     ).OrderByDescending(x => x.numberOfOrders).Distinct().Take(10); 

它會給你10個項目,每個項目包含產品對象和numberOfOrders整數。

編輯

由於這將是作爲一個方法的返回值,因爲C#不允許返回一個匿名類型(還沒有..這個功能是在C#4.0),在轉換匿名類入類。

創建一個類你想回到

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

    public Product product { get; set; } 
    public int numberOfOrders { get; set; } 
} 

,並使用該查詢返回該類

return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     group orderedProduct by product into productGroups 
     select new ProductOrders 
     { 
       product = productGroups.Key, 
       numberOfOrders = productGroups.Count() 
     } 
     ).OrderByDescending(x => x.numberOfOrders).Distinct().Take(10); 

返回值是現在式IEnumerable<ProductOrders>的對象的類型。

+0

我如何去從這個對象提取產品? – ajbeaven 2009-09-07 02:25:54

+0

假設返回值存儲在x中,請使用'x.product.ProductID'和'x.product.ProductName' – Aziz 2009-09-07 02:33:58

+0

抱歉,我不確定我應該使用什麼數據類型來存儲上述查詢的結果。我做我自己的? – ajbeaven 2009-09-07 02:46:08