LINQ to SQL具有多个连接,分组依据和计数

Jim*_*des 5 linq-to-sql

我有3个表,Cust,Order和Item,包含以下相关字段:

Cust - CustID, CustName
Order - OrderID, CustID
Item - ItemID, OrderID
Run Code Online (Sandbox Code Playgroud)

我想找到每个客户的订单和商品总数.

这是一个生成我想要的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
Run Code Online (Sandbox Code Playgroud)

我第一次尝试将其转换为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()
    };
Run Code Online (Sandbox Code Playgroud)

使用此代码,我得到了异常:

Value cannot be null. Parameter name: inner
Run Code Online (Sandbox Code Playgroud)

我是在正确的轨道上吗?要做到这两点,我需要做些什么?

Adu*_*cci 11

  1. 对于左连接 - 我建议使用froma where和aDefaultIfEmpty

  2. 您需要使用匿名类型进行分组才能对多个参数进行分组

值不能为空.参数名称:inner

任何连接属性都可以为空吗?

 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,
        };
Run Code Online (Sandbox Code Playgroud)