Итак, у каждого 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());
Таким образом, вы получите все заказы, каждый со всеми его OrderItems, у которых есть хотя бы один OrderItem с ProductName, равным productName.
В структуре сущностей вам не нужно самостоятельно использовать GroupJoin, вместо этого вы можете использовать виртуальную коллекцию ICollection. Я не уверен, поддерживает ли 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());
Последнее замечание: вы уверены, что свойство Order.OrderItems
является списком? Имеет ли Order.OrderItems [4] определенное значение? Разве это не должно быть ICollection<OrderItem>
?