2009-09-07 10 views
6

Estoy esperando obtener los 10 productos más solicitados. Mis cuadros tienen un aspecto similar a este:Linq a SQL: obtenga los 10 productos más pedidos

Producto
ProductID | ProductName

OrderedProduct
ProductID | OrderID

Solicitar
OrderID | DateOrdered

Por el momento tengo el siguiente:

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

He observado en la consulta anterior que no estoy seguro de qué poner. ¿Cómo ordeno por la cantidad de productos que aparecen en la tabla de productos ordenados?

+0

Puede encontrar esta pregunta útil: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql –

Respuesta

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

Le dará 10 elementos, cada elemento contiene el objeto del producto, y número entero NumberOfOrders.

Editar:

ya que será como un valor de retorno de un método, y desde C# no permite devolver un tipo anónimo (todavía .. esta función está en C# 4.0), se convierte el tipo anónimo en una clase.

crear una clase del tipo que desea devolver

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

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

y utilizar esta consulta para devolver los objetos de esa clase

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

El valor de retorno ahora es de tipo IEnumerable<ProductOrders>.

+0

¿Cómo puedo hacer esto? ir sobre la extracción del producto de este objeto? – ajbeaven

+0

suponiendo que el valor de retorno se almacena en x, use 'x.product.ProductID' y' x.product.ProductName' – Aziz

+0

lo siento, no estoy seguro de qué tipo de datos debo usar para almacenar el resultado de la consulta anterior. ¿Hago el mío? – ajbeaven