2009-09-07 40 views
6

我想抓住10个最常订购的产品。我的表看起来与此类似:Linq to SQL:获得排名前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 – 2009-09-07 00:42:56

回答

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

,并使用该查询返回该类

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

返回值是现在式IEnumerable<ProductOrders>的对象的类型。

+0

我如何去从这个对象提取产品? – ajbeaven 2009-09-07 02:25:54

+0

假设返回值存储在x中,请使用'x.product.ProductID'和'x.product.ProductName' – Aziz 2009-09-07 02:33:58

+0

抱歉,我不确定我应该使用什么数据类型来存储上述查询的结果。我做我自己的? – ajbeaven 2009-09-07 02:46:08