简体   繁体   English

如何使用 Entity Framework Core 从子表列表的每个订单中获取产品行?

[英]How to get product row from each order of child table list using Entity Framework Core?

I have two model entities:我有两个 model 实体:

public class Order
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int OrderId { get; set; }
        public Guid OrderGuid { get; set; }
        public string CustomOrderNumber { get; set; }
        public int StoreId { get; set; }
        public int UserId { get; set; }
        public virtual IList<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int OrderItemId { get; set; }
        public Guid OrderItemGuid { get; set; }
        public int OrderId { get; set; }
        public int Sno { get; set; }
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public int SKUId { get; set; }
        public string SKU { get; set; }
        public int Quantity { get; set; }
        public virtual Order Order { get; set; }
        public virtual ProductSKU ProductSKU { get; set; }
}

I want to get each order with particular product name row from order items.我想从订单项目中获取具有特定产品名称行的每个订单。

For example, suppose data in an order,orderitms has 5 product records.例如,假设一个订单中的数据,orderitms 有 5 条产品记录。

and assume that in that product name is abc having 2 records.并假设在该产品名称中 abc 有 2 条记录。

For the 2nd order, order items has 3 records, and one of those as abc product name.对于第二个订单,订单商品有 3 条记录,其中一条为abc产品名称。

I want get order list with orderitems of abc only... bellow i tried way there.我只想获取带有abc订单项的订单列表......下面我尝试了那里的方式。 in that I'm getting total orderitems因为我得到了总订单项

Please help me?请帮我?

I tried like this:我试过这样:

List<Contracts.Entities.Order> orders = DbSet.Include(t => t.OrderItems).ToList();

if (!string.IsNullOrEmpty(request.ProductName))
{
    List<OrderItem> orderItems = orders.SelectMany(t => t.OrderItems).Where(t => t.ProductName == request.ProductName).ToList();
    orders = orderItems.Select(t => t.Order).ToList();
}

So every OrderItem has a ProductName, and you want (several properties of) all Orders that have at least on OrderItem with this ProductName.因此,每个 OrderItem 都有一个 ProductName,并且您想要(的几个属性)至少在 OrderItem 上具有此 ProductName 的所有订单。

string productName = ...
var ordersWithProductName = dbContext.Orders.GroupJoin  
    dbContext.OrderItems,             // GroupJoin Orders with OrderItems
    order => order.OrderId            // from every Order take the primary key
    orderItem => orderItem.OrderId,   // from every OrderItem take the foreign key

    // parameter ResultSelector: 
    // take each Order with all its zero or more OrderItems to make one new object
    (order, orderItemsOfThisOrder) => new
    {
        // Select only the Order properties that you plan to use:
        Id = order.OrderId,
        UserId = order.UserId,
        ...

        Items = orderItemsOfThisOrder.Select(orderItem => new
        {
            Id = orderItem.OrderItemId,
            ProductName = orderItem.ProductName,
            ...

            // not needed, you know the value:
            // OrderId = orderItem.OrderId
        })
        .ToList(),
    })

    // keep only those Orders that have at least on OrderItem with productName
    .Where(order => order.Items
                         .Where(orderItem => orderItem.ProductName == productName)
                         .Any());

This way, you get all Orders, each with all its OrderItems, that have at least one OrderItem that has a ProductName equal to productName.这样,您将获得所有订单,每个订单都有其所有的 OrderItem,其中至少有一个 OrderItem 的 ProductName 等于 productName。

In entity framework you don't have to GroupJoin yourself, you can use the virtual ICollection instead.在实体框架中,您不必自己进行 GroupJoin,您可以使用虚拟 ICollection 代替。 I'm not sure if ef-core supports this:我不确定 ef-core 是否支持这个:

    var ordersWithProductName = dbContext.Orders.Select(order => new
    {
        // Select only the Order properties that you plan to use:
        Id = order.OrderId,
        UserId = order.UserId,
        ...

        Items = order.OrderItems.Select(orderItem => new
        {
            Id = orderItem.OrderItemId,
            ProductName = orderItem.ProductName,
            ...

            // not needed, you know the value:
            // OrderId = orderItem.OrderId
        })
        .ToList(),
    })

    // keep only those Orders that have at least on OrderItem with productName
    .Where(order => order.Items
                         .Where(orderItem => orderItem.ProductName == productName)
                         .Any());

One final remark: are you sure that property Order.OrderItems is a List?最后一句话:您确定属性Order.OrderItems是一个列表吗? Does Order.OrderItems[4] have a defined meaning? Order.OrderItems[4] 是否有明确的含义? Shouldn't it be an ICollection<OrderItem> ?不应该是ICollection<OrderItem>吗?

You can write like this:你可以这样写:

List<Contracts.Entities.Order> orders = DbSet.Order.Include(t => t.OrderItems).ToList();

        if (!string.IsNullOrEmpty(request.ProductName))
        {
            orders = orders.Where(r => r.OrderItems.Any(rc => rc.ProductName == request.ProductName)).ToList();
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM