[英]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.