LINQ to Entities有没有类似于DataLoadOptions的东西?

5

在LINQ to Entities中是否存在与LINQ to SQL中的DataLoadOptions类相对应的版本?基本上我想要一个地方来存储所有的贪婪加载配置,而不必为所有的LINQ to Entities查询添加.Include()调用。或者如果有更好的解决方案,也非常欢迎。

TIA,
Benjy


提醒任何在谷歌上偶然发现这篇文章的人:http://www.governor.co.uk/news-plus-views/2010/2/16/entityframework-include-multiple-extension-method 也非常有帮助。 - benjy
2个回答

5

Entity Framework不支持在整个“ObjectContext”中设置贪婪加载选项。但是,您可以在部分类中声明所有需要的“IQueryable”属性,并使用包含选项。例如:

public IQueryable<Order> Orders {
  get {
    return OrderSet.Include("OrderDetails");
  }
}

5
个人而言,我很高兴EF中没有(官方的)DataLoadOptions的等价物。为什么呢?有几个原因:
  • 使用它们容易导致异常,请参阅MSDN页面的备注部分。
  • 我不喜欢过滤的子集合概念。当CustomerOrders时,我希望Orders成员代表该客户的订单(延迟加载或非延迟加载)。在其他地方定义过滤器(by AssociateWith)容易被忘记。我会在需要的时候在何处过滤它们。这导致了最后一个反对:
  • 最重要的是:DataLoadOptions是有状态的,大多数错误都是由于意外状态引起的。DataLoadOptions以一种影响后续查询的方式改变了DataContext的状态。我更喜欢在需要的地方定义急切加载。打字很便宜,但错误很昂贵。

尽管如此,为了完整起见,我应该提到Muhammad Mosa在EF版本的DataLoadOptions中做了一些努力。不过,我从未尝试过。

我意识到你可能想避免重复的代码。但是如果您需要在多个地方使用完全相同的查询,则已经重复了代码,无论是否定义了“全局”包含。集中的急切加载配置是伪DRY性。很快,当不希望进行急切加载时,您会发现自己被自己绊倒了,但是,该操作已进行配置!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接