2009-09-07 5 views
6

Chcę pobrać 10 najczęściej zamawianych produktów. Moi stoły wyglądają podobnie do tego:Linq do SQL: Zdobądź 10 najczęściej zamawianych produktów

wyrobów
ProductID | ProductName

OrderedProduct
ProductID | OrderID

Zamówienie
OrderID | DateOrdered

W tej chwili mam następujące:

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

Zauważyłem w powyższym zapytaniu, gdzie nie jestem pewien, co umieścić. Jak mogę uporządkować według liczby produktów, które pojawiają się w tabeli produktów zamówionych?

+0

Można znaleźć na to pytanie przydatne: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql –

Odpowiedz

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

Otrzymasz 10 pozycji, każda pozycja zawiera obiekt produktu i numberOfOrders integer.

Edit:

Od tego będzie jako wartość zwracana przez metodę, a od C# nie zezwala na powrót typ anonimowy (jeszcze .. ta funkcja jest w C# 4.0), należy przekonwertować anonimowy typ w klasie.

Utwórz klasę typu chcesz powrócić

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

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

i Użyj tej kwerendy, aby powrócić obiektów tej klasy

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

Wartością zwracaną jest teraz typu IEnumerable<ProductOrders>.

+0

jak mogę czy chcesz wydobyć produkt z tego obiektu? – ajbeaven

+0

zakładając, że wartość zwracana jest przechowywana w x, użyj 'x.product.ProductID' i' x.product.ProductName' – Aziz

+0

Przepraszam, nie jestem pewien jakiego typu danych powinienem użyć do przechowywania wyniku z powyższego zapytania. Czy tworzę własne? – ajbeaven