【问题标题】:Entity Framework Linq query unrelated child tablesEntity Framework Linq 查询不相关的子表
【发布时间】:2015-08-03 15:52:15
【问题描述】:

我正在使用 Entity Framework 6.1.3 来生成实体和数据模型。

如果我有两个表:Orders -> OrderDetails,它们之间有关系(OrderId),那么我可以通过以下查询获取所有订单和相关的 OrderDetails

dbContext.Order().Include(a => a.OrderDetails);

但是,如果我为 Orders 创建了一个视图 (vOrder),则模型中的 vOrder 和 OrderDetails 之间没有直接关系,尽管我可以通过 OrderId 上的连接将它们链接在一起。我怎么还能从 vOrder 和相关的 OrderDetails 中获取所有数据。除非我手动添加所有导航属性,否则以下查询不起作用。

dbContext.vOrder().Include(a => a.OrderDetails);

是否有一个简单的 LINQ 查询来完成预期的查询?

感谢您的帮助。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    进行手动连接并返回一个包含两者的匿名对象。

    类似:

    dbContext.vOrder
      .GroupJoin(
        dbContext.OrderDetails,
        v=>v.orderid,
        od=>o.orderid,
        (v,od)=>new {v=v,od=od});
    

    当然,您可以在 vOrder 上添加适当的导航属性,然后按照您说的做。

    【讨论】:

    • 非常感谢,它正在工作。我也可以尝试在视图上添加一个导航属性,看看哪个更好。
    • 我认为您会发现添加导航属性会更好,因为它可以在整个项目中重复使用,并且大大简化了您的查询。我建议从 vOrder 到 Order 的导航属性。如果需要,您可以随时从 Order 的导航属性中获取详细信息。
    • 导航属性就像向开发人员说“转到这里获取我的详细数据”的路标,因此它们通常会减少代码,但 ORM 或 RDBMS 导航属性通常会获得额外的好处,例如索引.导航属性提供可重用代码和可重用代码模式,当您确定在两个实体之间导航的最佳方式时使用它们
    【解决方案2】:

    为什么不在视图中包含更多列(或创建另一个包含所有必需数据的视图,如果您不想修改第一个视图)?

    【讨论】:

    • 视图和明细表是一对多的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多