2009-09-07 6 views
6

を取得します。LINQの:私は10社の、最も注文された製品をつかむしたいんだトップ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 –

答えて

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; } 
} 

を返し、戻り値は、現在のタイプIEnumerable<ProductOrders>であり、そのクラスのオブジェクト

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); 

を戻すには、このクエリを使用するタイプのクラスを作成します。

+0

このオブジェクトから製品を抽出してみましょうか? – ajbeaven

+0

は 'x.product.ProductID'と申し訳ありません' x.product.ProductName' – Aziz

+0

を使用して、戻り値をxに格納されたと仮定すると、私は上記のクエリからの結果を格納するために使用すべきかのデータ型はよく分かりません。私は自分で作るのですか? – ajbeaven

関連する問題