0

こんにちは、Entity Framework のクエリについて質問があります

私の親アイテムはworkorders

私の子アイテムはworkorderitems

列が変数 (myid) と一致するworkorderitemsテーブルからすべての項目を選択したいと考えています。workorder_id結果は項目名でグループ化し、数量を合計する必要があります。

GroupByまた、 andステートメントを削除するとSelect、クエリは結果を返しますが、GroupByandSelectステートメントではエラーが発生します。

以下は私の構文です:

var workorderitems= DBContext.WorkOrderItems
.Where(o => o.workorder_id == myid)
.GroupBy(grp => new { grp.ItemName })
.Select(result => new { itemname = result.Key.ItemName, qty = result.Sum(o => o.ItemQuantity) });



   var mycount = workorderitems.Count();

私のシナタックスが正しいと思われるかどうか誰かに知らせてもらえますか?

4

1 に答える 1

0

実際には別の Select を使用する必要はありません。GroupBy メソッドのオーバーロードの 1 つを使用することで、'keySelector' および 'resultSelector' パラメーターを使用してグループと合計の両方を組み合わせることができます。

GroupBy は非常に強力なメソッドで、最初は非常に気が遠くなる可能性がありますが、理解すれば、非常に簡単で非常に用途の広い方法です。

以下に例を示します。結果が集約された WorkOrderItems のリストが各グループに 1 つずつ作成されます。匿名オブジェクトのリストを返すのではなく。複数のキー セレクター (group by 句) を使用してこれを拡張し、結果のオブジェクトの合計と操作のすべての方法を実行できます...

class Program
{
    static void Main(string[] args)
    {
        var myItems = new List<WorkOrderItem>
        {
            new WorkOrderItem { OrderId = 1, ItemName = "A", ItemQuantity = 0 },
            new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 1 },
            new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 2 },
            new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 3 },
            new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 4 },
            new WorkOrderItem { OrderId = 1, ItemName = "B", ItemQuantity = 5 },
            new WorkOrderItem { OrderId = 0, ItemName = "C", ItemQuantity = 6 },
        };

        int myId = 0;

        List<WorkOrderItem> groupedItems =
            myItems.Where(i => i.OrderId == myId)
                    .GroupBy(
                        //key selector
                        i => i.ItemName,
                        //result selector
                        (name, items) =>
                        {
                            var aggregatedItem = new WorkOrderItem
                            {
                                OrderId = myId,
                                ItemName = name,
                                ItemQuantity = items.Sum(i => i.ItemQuantity)
                            };
                            return aggregatedItem;
                        })
                        .ToList();


    }

    class WorkOrderItem
    {
        public int OrderId { get; set; }
        public string ItemName { get; set; }
        public int ItemQuantity { get; set; }
    }
}

Linq で最も過小評価されているメソッドの 1 つについてさらに読むには、Jon Skeet による次のブログ投稿を参照することを強くお勧めし ます。 objects-part-21-groupby/

于 2015-05-29T15:36:38.743 に答える