1

EntityFrameworkモデルには次の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そこから一致するものを見つけることができます。1つの方法は、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

に変更OrderByDescendingするだけOrderByで、昇順で並べ替えられます。

于 2012-11-09T01:20:40.060 に答える
0

ProductsからOrderedItemsへの左外部結合が必要なようです。productsQtyOrderedItemsの数量が含まれる製品のリストが含まれている必要があります。含まれていない場合は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 に答える