使用Lambda表达式在Entity Framework 4中使用Include功能

93

我看过许多关于如何解决这个问题的文章,所有这些文章都与CTP4有关,或者是添加自己的扩展方法。

是否有一种“官方”的EF4内置方法可以在include中使用lambda表达式(用于第一级关系以及第二级和更高级别),或者最终未包含在RTM中?

如果有的话,我很乐意学习如何做到这一点,因为现在在我的代码中使用lambda表达式(使用#system.data.entity #system.data.linq)仍然会给我带来:

Cannot convert lambda expression to type 'string' because it is not a delegate type on:

var customers = from c in
context.Customers.Include(c=>c.Phone)

1
不,除了CTP4之外,它不存在。我使用扩展方法/枚举来实现类型安全。 - RPM1984
我也这样做了,所以微软在 CTP4 中包含了它,但在 RTM 中将其删除了? - Dani
3个回答

241

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团队博客文章获取更多信息。


1
虽然 ADO.net 博客的链接仍然相关,但同一主题的 EF6 参考/指南为:加载相关实体 我认为文档需要换成公主和独角兽的例子,而不是他们一直在使用的博客和帖子。 - Arkaine55
1
谢谢,我刚刚添加了 using System.Data.Entity;,现在可以工作了。 - adnan
团队博客链接已失效,这是新位置 - Nintynuts

92

虽然问题中已经暗示了这一点,但对于其他遇到无法在 .Include 中使用 lambda 表达式的人来说,请确保你已经做到了这一点:

using System.Data.Entity;

5

目前RTM版本不支持Lambda表达式的Include。我正在使用这个

当我们谈论CTP4时,我们指的是Entity Framework功能。它是比EF4更新的API,主要包括Code First和其他一些改进。


你知道微软什么时候会支持这个功能吗?我了解到,所有这些扩展方法在处理大型/多级对象时存在性能问题 - 因为每次调用都需要重新遍历一遍,而对象“定义”树是恒定的并且可以缓存,但目前还没有这样的解决方案。 - Dani
Entity Framework 功能目前处于 CTP5 预发布阶段。我猜测 RTM 版本应该会在 2011 年第一季度发布。希望它会包含使用 lambda 表达式的 Include 功能,但我还没有检查过其实现,因此无法确定它是否使用任何类型的缓存。 - Ladislav Mrnka
31
截至EF 4.3.x,这个答案是错误的。其他答案是正确的,必须使用using System.Data.Entity才能获得带有Lambda表达式的重载函数。 - Eric J.
1
@EricJ:是的。自EF 4.1以来,强类型Include就可用了。 - Ladislav Mrnka

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