Linq to SQL:获取前10个最受欢迎的产品订单

6
我想获取最常被订购的10个产品。我的表格类似于这样: 产品
产品ID | 产品名称 已订购的产品
产品ID | 订单ID 订单
订单ID | 下单日期 目前我有以下内容:
return (from product in db.Products
        from orderedProduct in db.OrderedProducts
        where orderedProduct.ProductID == product.ProductID
        select product).OrderByDescending(???).Distinct().Take(10);

我在上面的查询中指出了我不确定该放什么的地方。如何按照出现在已排序产品表中的产品数量进行排序?


你可能会发现这个问题很有用: https://dev59.com/X0nSa4cB1Zd3GeqPKQjf - James Black
1个回答

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>


我该如何从这个对象中提取产品? - ajbeaven
假设返回值存储在变量x中,使用x.product.ProductIDx.product.ProductName - Aziz
抱歉,我不确定应该使用什么数据类型来存储上述查询的结果。我需要自己创建吗? - ajbeaven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接