将 Entity Framework 4 中的 Include 与 lambda 表达式一起使用
Posted
技术标签:
【中文标题】将 Entity Framework 4 中的 Include 与 lambda 表达式一起使用【英文标题】:Using Include in Entity Framework 4 with lambda expressions 【发布时间】:2011-05-31 11:51:03 【问题描述】:我看过很多关于如何克服这个问题的文章,都与CTP4有关,或者添加我自己的扩展方法。
是否有一种“官方”包含 EF4 的方式来在 include 中使用 lambda 表达式(对于第一级关系以及第二级和更高级别),还是最终不包含在 RTM 中?
有一个 - 我很高兴学习如何做到这一点,因为现在在我的代码中使用 lambda 表达式(使用#system.data.entity #system.data.linq)仍然给我:
无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型 上:
var customers = from c in
context.Customers.Include(c=>c.Phone)
【问题讨论】:
不,它不存在(除了 CTP4 - 正如你所说)。我使用扩展方法/枚举来实现类型安全。 我也是这样做的,所以 MS 将其包含在 CTP4 中并在 RTM 中将其删除? 【参考方案1】:Entity Framework 4.1 的 RTM 版本实际上在 EntityFramework.dll
文件中包含 扩展方法,用于通过 Include
函数使用 lambda 进行预加载。只需将 DLL 包含在您的项目中,您就可以编写如下代码:
var princesses1 = context.Princesses.Include(p => p.Unicorns).ToList();
记得添加一个 Import/Using 语句以包含 System.Data.Entity 命名空间。否则编译器找不到扩展方法。例如:
using System.Data.Entity;
有关更多信息,请参阅这篇 ADO.NET team blog 文章。
【讨论】:
虽然指向 ADO.net 博客的链接仍然有效,但同一主题的 EF6 参考/指南是:Loading Related Entities 我认为文档需要切换到 Princess 和 Unicorn 示例,而不是他们在任何地方都在使用的博客和帖子。 谢谢,我只是使用 System.Data.Entity 添加;它对我有用。 团队博客链接失效,this is the new location【参考方案2】:尽管问题中暗示了这一点,但对于遇到相同问题的任何其他人,他们无法将 lambda 与 .Include 一起使用,请确保您有这个:
using System.Data.Entity;
【讨论】:
【参考方案3】:目前没有官方支持在 RTM 中包含 lambda 表达式。我正在使用this。
当我们谈论 CTP4 时,我们指的是实体框架功能。它是比 EF4 更新的 API。它主要包括 Code First 和其他一些改进。
【讨论】:
知道 MS 什么时候支持这个功能?我知道所有这些扩展方法都存在大型/多级对象的性能问题 - 因为它们需要一次又一次地遍历每个包含的调用,并且虽然对象“定义”树是常量并且可以缓存,但没有像这样的解决方案这还没有。 实体框架功能目前在 CTP5 中。我猜 RTM 版本应该在 2011 年第一季度发布。所以希望它包含带有 lambda 表达式的 Include,但我还没有检查它的实现,所以我不能说它是否使用任何类型的缓存。 从 EF 4.3.x 开始,这个答案是错误的。其他答案是正确的,必须有 using System.Data.Entity 来获得 lamda 表达式的重载。 @EricJ:是的。自 EF 4.1 起,强类型的 Include 可用。以上是关于将 Entity Framework 4 中的 Include 与 lambda 表达式一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Oracle 和 SQL Server 将 .NET 4.5 C# Entity Framework 6 中的列映射为大写?
Entity Framework 4.1 Fluent API 中的多个类映射到同一个表
使用 Entity Framework 4 和 Linq 查询比较 DateTime 属性中的日期的简单方法