EF核心查询,关系的总和小于属性。

问题描述 投票:0回答:1

我有一个类,一个产品类和一个跟踪订单的类。这两个类都存储在数据库中,我使用ef core作为ORM。

public class Product
{
    public int Id { get; set; }
    public int AvailableQuantity { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public bool Confirmed { get; set; }
    public int Quantity { get; set; }
    public int ProductId { get; set; }
    public Product Product { get; set; }
}

现在,我需要得到所有产品,其中的总和是 Order.Quantity 小于 Product.AvailableQuantityOrder.Confirmed 属性为真。

我已经尝试过

_context.Products.Where(product => product.Orders.Where(order => order.Confirmed).Sum(order => order.Quantity) < product.AvailableQuantity)

但这显然没有工作。我想我需要一些带有 GroupBy但我不知道如何让这个查询工作,而且我不想使用 AsEnumerable 并在内存中执行查询,因为我的数据库很大。

c# linq entity-framework-core linq-to-entities
1个回答
0
投票

你写道

获取所有订单数量之和小于产品可用数量且订单确认属性为真的产品。

我想你的意思是这样的。

要求: 获取所有产品及其确认的订单,这些确认订单的数量之和小于产品的AvailableQuantity。

如果您可能希望在您的最终结果中也包含未确认的订单。这不会有太大的变化。

var result = dbContext.Products.Where(product =>

    // keep only the Products where the sum of the confirmed orders is less than ...
    product.Orders.Where(order => order.Confirmed)
                  .Select(order => order.Quantity)
                  .Sum() < product.AvailableQuantity);

这将为您提供具有以下特征的产品 他们的订单:已确认的和未确认的。

如果您只想要已确认的订单,可以考虑先使用选择。

var productsThatCanBeDelivered = dbContext.Products.Select(product => new
{
    // Select only the product properties that you plan to use:
    Id = product.Id,
    AvailableQuantity = product.AvailableQuantity,

    ConfirmedOrders = product.Orders
        .Where(order => order.Confirmed)
        .Select(order => new
        {
            // select only the order properties that you plan to use
            Id = order.Id,
            Quantity = order.Quantity,
            ...

            // no need for this: you already know the value
            // ProductId = order.ProductId,
            // Confirmed = order.Confirmed,
        })
        .ToList(),
    })

    // keep only those Products where the quantities of the confirmed orders is less than ...
    .Where(product => product.ConfirmedOrders
                             .Select(confiredOrder => confirmedOrder.Quantity)
                             .Sum() < product.AvailableQuantity);

最后一句话:你确定你的意思是小于AvailableQuantity,而不是小于或等于:如果有一个Available产品,而你只需要交付一个,为什么不交付呢?


0
投票
_context.Orders.Where(c => c.Confirmed).AsQueryable().GroupBy(c => c.ProductId)
               .Where(c => c.Sum(d => d.Quantity) < c.First().Product.AvailableQuantity)
               .ToDictionary(c => c.Key, c => c);

你的意思是这样的吗?

© www.soinside.com 2019 - 2024. All rights reserved.