从主人到细节的关系,但反之亦然

时间:2017-06-18 17:29:45

标签: c# entity-framework linq

我有一个Order个实体,它有多个OrderItem个实体。和类看起来像那样。

class Order
{
     int Id;
     string Note;
     List<OrderItem> OrderItems;
}

class OrderItem
{
     int Id;
     string Name;
}

正如您所看到的,Order知道其OrderItemsOrderItem并不了解其Order

问题是如何编写linq查询来查询属于特定OrderItem的{​​{1}}的上下文?

3 个答案:

答案 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),那么您将无法从数据库加载不一致的数据。