7

次の関連フィールドを持つ 3 つのテーブル、Cust、Order、および Item があります。

Cust - CustID, CustName
Order - OrderID, CustID
Item - ItemID, OrderID

各顧客の注文とアイテムの合計数を見つけたいです。

これは、私が欲しいものを生成する SQL ステートメントです。各顧客の合計注文数と注文されたアイテムの合計数を含む顧客のリストです。

SELECT
  Cust.CustID, Cust.CustName,
  count(DISTINCT Order.OrderID) AS numOrders,
  count(DISTINCT Item.ItemID ) AS numItems
FROM Cust
LEFT JOIN Order ON Order.CustID = Cust.CustID
LEFT JOIN Item ON Item.OrderID = Order.OrderID
GROUP BY Cust.CustID, Cust.CustName
ORDER BY numItems

これをLINQに変換する最初の試みは、アイテムを数えることで、これを思いつきました:

var qry = from Cust in tblCust
    join Order in tblOrder on Cust.CustID equals Order.CustID
    join Item in tblItem on Order.OrderID equals Item.OrderID
    group Cust by new {CustID = Cust.CustID, CustName = Cust.CustName} into grp
    orderby grp.Count()
    select new
    {
        ID = grp.Key.CustID,
        Name = grp.Key.CustName,
        Cnt = grp.Count()
    };

このコードでは、例外が発生します。

Value cannot be null. Parameter name: inner

私は正しい軌道に乗っていますか?両方のカウントを取得するにはどうすればよいですか?

4

1 に答える 1

15
  1. 左結合の場合-aとaを使用することをお勧めしfromますwhereDefaultIfEmpty

  2. 複数のパラメータをグループ化するには、匿名タイプを使用してグループ化する必要があります

値をnullにすることはできません。パラメータ名:内部

結合プロパティのいずれかがnull許容ですか?

 var qry = 
        from Cust in tblCust
        from Order in tblOrder.Where(x => Cust.CustID == x.CustID)
                              .DefaultIfEmpty()
        from Item in tblItem.Where(x => Order.OrderID == x.OrderID)
                            .DefaultIfEmpty()
        group new { Cust, Order.OrderId, Item.ItemId } by new { Cust.CustID, Cust.CustName } into grp
        let numItems = grp.Select(x => x.ItemId).Distinct().Count()
        orderby numItems 
        select new
        {
            ID = grp.Key.CustID,
            Name = grp.Key.CustName,
            numOrders = grp.Select(x => x.OrderId).Distinct().Count(),
            numItems,
        };
于 2012-07-20T17:03:44.523 に答える