2009-09-07 12 views
6

Sto cercando di afferrare i 10 prodotti più ordinati. Le mie tabelle simile a questa:Linq to SQL: ottieni i primi 10 prodotti più ordinati

prodotto
ProductID | ProductName

OrderedProduct
ProductID | OrderID

Ordinare
OrderID | DateOrdered

Al momento ho il seguente:

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

Ho notato nella query precedente dove sono incerto su cosa mettere. Come faccio a ordinare il numero di prodotti che compaiono nella tabella dei prodotti ordinati?

+0

È possibile trovare questa domanda utile: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql –

risposta

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

Vi darà 10 articoli, ogni oggetto contiene oggetto prodotto e numeroOdiOrders intero.

Edit:

Dal momento che questo sarà come valore di ritorno di un metodo, e dal momento che C# non consente la restituzione di un tipo anonimo (ancora .. Questa funzionalità è in C# 4.0), si converte il tipo anonimo in una classe.

creare una classe del tipo che si desidera tornare

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

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

e utilizzare questa query per restituire gli oggetti di quella classe

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

Il valore di ritorno è ora di tipo IEnumerable<ProductOrders>.

+0

Come faccio andare a estrarre il prodotto da questo oggetto? – ajbeaven

+0

assumendo che il valore di ritorno sia memorizzato in x, usare 'x.product.ProductID' e' x.product.ProductName' – Aziz

+0

scusate, non sono sicuro di quale tipo di dati dovrei usare per memorizzare il risultato dalla query sopra. Faccio mio? – ajbeaven