我有一个Order
个实体,它有多个OrderItem
个实体。和类看起来像那样。
class Order
{
int Id;
string Note;
List<OrderItem> OrderItems;
}
class OrderItem
{
int Id;
string Name;
}
正如您所看到的,Order
知道其OrderItems
和OrderItem
并不了解其Order
。
问题是如何编写linq查询来查询属于特定OrderItem
的{{1}}的上下文?
答案 0 :(得分:2)
您的Order
课程中需要OrderItem
属性。此外,您应该在课程中使用properties而不是以下字段:
public class Order
{
public int Id { get; set; }
public string Note { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Order Order { get; set; }
}
另请注意,我使用virtual
关键字而ICollection
代替List
,这使得该属性支持延迟加载。
答案 1 :(得分:2)
您将查询正确的Order
,然后选择相关的OrderItem
(s),例如:
var orderItems = context.Orders
.Where(o => o.Id == selectedId)
.Select(o => o.OrderItems)
.ToList();
这为您提供了与ID为selectedId
的订单相关联的订单商品列表。
答案 2 :(得分:2)
Context.Orders.Where(x => x.Id == 1234).SelectMany(x => x.OrderItems);
或者您可以Context.Where(x => x.Id == 1234).Include(x => x.OrderItems)
获取订单并预加载其商品。
我建议将Order.OrderItems属性设置为虚拟,因此至少如果您忘记预加载(或.Include
),那么您将无法从数据库加载不一致的数据。