首页 > 解决方案 > LINQ - 左连接和分组依据

问题描述

我有个问题。这是我的产品类

public int ProductID { get; set; }
public string ProductName { get; set; }
public int CategoryID { get; set; }
public decimal Price { get; set; }
public int CompanyID { get; set; }
public string QuantityPerUnit { get; set; 

这是 OrderDetail 类

public int DetailID { get; set; }
public int OrderID { get; set; }
public int ProductID { get; set; }
public decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public bool Discount { get; set; }

所以我在 mssql 中写了这个查询。那么,如何在 linq 上编写此查询?

select Products.ProductID, Sum(OrderDetails.Quantity) as 'NumberOfOrdered' from Products
left join OrderDetails on Products.ProductID = OrderDetails.ProductID
group by Products.ProductID
order by Products.ProductID

我写了这个查询,但它不起作用。

from p in _context.Products
join d in _context.OrderDetails on p.ProductsID equals d.ProductsID into t1
from d1 in t1.DefaultIfEmpty()
group new { p, d } by new { p.ProductsID, d.ProductsID } into g
orderby g.Key.ProductsID
select new ProductsOrderDetails
{
ProductsID = g.Key.ProductsID,
QuantityToplam = g.(x=>x.d.Quantity)
}).ToList();

标签: linq

解决方案


所以你有ProductsOrderDetails。每一个Product都有零个或多个OrderDetails,每一个OrderDetail都是恰好一个的细节Product,即属于的Product那个。OrderDetail.ProductId

要求:从 everyProduct中,给我 Id 和所有它的 Quantities 的总和OrderDetails

每当您需要项目序列时,每个项目及其子项目,例如学校及其学生,作者及其书籍,订单及其 OrderDetails,请考虑使用Enumerable.GroupJoin的重载之一

在这种情况下,我不想要一个带有 OrderDetails 的简单产品,我想编写一个特殊的结果。对于每个产品,我想要其所有 OrderDetauls 的 Id 和数量之和。因此,我使用带参数的重载resultSelector

var result = dbContext.Products.GroupJoin(    // GroupJoin Products
     dbContext.OrderDetails,                  // with Orderdetails
    product => product.Id,                    // From every Product take the Id
    orderDetail => orderDetail.ProductId,     // From every OrderDetail that the foreign key

    // resultSelector: for every Product and all its zero or more OrderDetails
    // create one new object
    (product, orderDetailsOfThisProduct) => new
    {
        Id = product.Id,
        QuantitiesToPlam = orderDetailsOfThisProduct
            .Select(orderDetail => orderDetail.Quantity)
            .Sum(),
    });

对于属性 QuantitiesToPlam:对于属于该产品的每个 OrderDetail:取属性 Quantity 的值,并将它们求和。


推荐阅读