【问题标题】:Relation from master to details but not vice versa大师与细节的关系,反之则不然
【发布时间】:2017-11-20 21:50:06
【问题描述】:

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

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

class OrderItem
{
     int Id;
     string Name;
}

如您所见,Order 知道它的OrderItemsOrderItem 不知道它的Order

问题是我如何编写一个 linq 查询来查询属于特定 orderOrderItem 的上下文?

【问题讨论】:

  • 我对 EF 很陌生,所以我对该工具了解不多,但我正在尝试 context.OrderItems.Where(x => x.Order.Id == 999) 。但这是我遇到问题的地方,没有属性 x.Order 可以输入到查询中。
  • 通常你在你OrderItem中有一个OrderId。为什么不存在?你写了那些类?如果它们是生成的,我真的很想知道你的数据模型......如果你写了它们,只需在它所属的地方添加 OrderId。就像现在一样,您只能获取属于一个订单的所有订单项,而不是一个单独的订单项:Order.OrderItems。

标签: c# entity-framework linq


【解决方案1】:

您的OrderItem 类中需要一个Order 属性。你也应该在你的类中使用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,这使得该属性支持延迟加载。

【讨论】:

    【解决方案2】:

    您将查询正确的Order,然后选择相关的OrderItem(s),例如:

    var orderItems = context.Orders
                            .Where(o => o.Id == selectedId)
                            .Select(o => o.OrderItems)
                            .ToList();
    

    这将为您提供与 ID 为 selectedId 的订单关联的订单商品列表。

    【讨论】:

      【解决方案3】:

      Context.Orders.Where(x =&gt; x.Id == 1234).SelectMany(x =&gt; x.OrderItems);

      或者您可以通过Context.Where(x =&gt; x.Id == 1234).Include(x =&gt; x.OrderItems) 获取订单并预加载其商品。

      我建议将 Order.OrderItems 属性设为虚拟,因此至少如果您忘记预加载(或 .Include),那么您将不会从数据库中加载不一致的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        相关资源
        最近更新 更多