2009-09-07 10 views
6

Ich möchte die 10 am häufigsten bestellten Produkte greifen. Meine Tabellen ähnlich aussehen wie diese:Linq to SQL: Get Top 10 am meisten bestellten Produkte

Produkt
ProductID | ProductName

OrderedProduct
ProductID | OrderID

Bestellen
OrderID | DateOrdered

Im Moment ich habe folgendes:

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

Ich habe in der obigen Abfrage festgestellt, wo ich unsicher bin, was ich setzen soll. Wie sortiere ich nach der Anzahl der Produkte, die in der Tabelle der bestellten Produkte angezeigt werden?

+0

Sie können diese Frage hilfreich finden: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql –

Antwort

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

Es gibt Ihnen 10 Elemente, jedes Element enthält Produktobjekt und numberOfOrders Integer.

bearbeiten:

Da dies für ein Verfahren als Rückgabewert, und da C# erlaubt es nicht, einen anonymen Typ Rückkehr (noch .. Diese Funktion ist in C# 4.0), können Sie die konvertieren anonymer Typ in eine Klasse.

Erstellen Sie eine Klasse des Typs Sie

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

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

und Verwenden Sie diese Abfrage zurückzukehren Objekte dieser Klasse

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

Der Rückgabewert jetzt vom Typ IEnumerable<ProductOrders> zurückkehren möchten.

+0

Wie kann ich Gehen Sie über das Extrahieren des Produkts von diesem Objekt? – ajbeaven

+0

unter der Annahme, dass der Rückgabewert in x gespeichert ist, verwenden Sie 'x.product.ProductID' und' x.product.ProductName' – Aziz

+0

Entschuldigung, ich bin mir nicht sicher, welchen Datentyp ich verwenden soll, um das Ergebnis der obigen Abfrage zu speichern. Mache ich mein eigenes? – ajbeaven