1

我在实体框架模型中有这 3 个表/类:

Orders (OrderedItems, OrderTime)
OrderedItems (Product, Qty)
Products (Name, CreatedTime)

我可以通过这样做来选择最畅销的产品

var items = Orders.SelectMany(o => o.OrderedItems);
var products = items.GroupBy(oi => oi.Product)
                    .OrderByDescending(g => g.Sum(oi => oi.Qty))
                    .Select(g => g.Key).Take(10);

我如何选择性能最差的产品(即相反)?

注意:订单表中可能不存在性能最差的产品,因为它们可能永远不会被订购。

4

5 回答 5

2
var items = Orders.SelectMany(o => o.OrderedItems);
var products = items.GroupBy(oi => oi.Product)
                    .OrderBy(g => g.Sum(oi => oi.Qty))
                    .Select(g => g.Key).Take(10);
于 2012-11-09T01:19:47.207 回答
2

尝试

OrderBy(g => g.Sum(oi => oi.Qty))

它会将最低金额放在首位。

于 2012-11-09T01:19:59.933 回答
2

您可以从Products表格开始并从那里找到匹配项。一种方法是使用join into子句对Products表进行分组OrderedItems

var items = Orders.SelectMany(o => o.OrderedItems);
var products = (from product in Products
                join item in items on product equals item.Product into matchingItems
                orderby matchingItems.Sum(oi => oi.Qty)
                select product).Take(10);

另一种可能效率较低但您可能会发现更具可读性的方法是使用以下方法过滤项目Enumerable.Where()

var items = Orders.SelectMany(o => o.OrderedItems);
var products = (from product in Products
                orderby items.Where(oi => oi.Product == product).Sum(oi => oi.Qty)
                select product).Take(10);

这很好地转化为方法语法:

var items = Orders.SelectMany(o => o.OrderedItems);
var products = Products.OrderBy(p => items.Where(oi => oi.Product == product)
                                          .Sum(oi => oi.Qty))
                       .Take(10);
于 2012-11-09T02:22:37.317 回答
1

只需更改OrderByDescendingOrderBy,它应该按升序排列它们。

于 2012-11-09T01:20:40.060 回答
0

看来您需要从 Products 到 OrderedItems 的左外连接。productsQty应包含带有来自 OrderedItems 的数量的产品列表,如果没有,则为 0。

var productQty = from p in Products
            join oi in OrderedItems on p equals oi.Product into joined
            from poi in joined.DefaultIfEmpty()
            select new { Product = p, Qty = poi == null ? 0 : poi.Qty };
var products = productQty.GroupBy(p => p.Product).OrderBy(g => g.Sum(oi => oi.Qty)).Take(10);

更新:查询已更正。

于 2012-11-09T02:54:15.410 回答