将Entity Framework 4中的Include与lambda表达式一起使用


88

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

是否存在“官方” EF4包含方式在include(用于第一级关系以及第二级及更高级别)中使用lambda表达式,还是最终未包含在RTM中?

它只有一个-我将很高兴学习如何做,因为现在在我的代码中使用lambda表达式(使用#system.data.entity#system.data.linq)仍然可以给我:

无法将lambda表达式转换为“字符串”类型,因为它不是以下类型的委托类型:

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

1
不,它不存在(除了CTP4-如您所说)。我使用扩展方法/枚举来实现类型安全。
RPM1984

我也是这样做的,所以MS将其包含在CTP4中并在RTM中将其删除了?
Dani

Answers:


229

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参考/指南是:加载相关实体我认为文档需要切换到Princess和Unicorn示例,而不是他们一直在使用的Blog和Post。到处。
Arkaine15年

1
谢谢,我只是使用System.Data.Entity添加;我的工作。
adnan

团队博客链接已死,这是新位置
Nintynuts

89

尽管问题中暗示了这一点,但是对于其他人,如果遇到同样的问题而无法将lambda与.include一起使用,请确保您具有以下条件:

using System.Data.Entity;

5

目前,尚无官方支持RTM中的lambda表达式包含。我正在用这个

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


MS何时会支持此功能?我知道所有这些扩展方法都对大型/多级对象存在性能问题-因为它们需要一次又一次遍历每次对include的调用,并且尽管对象“定义”树是恒定的并且可以缓存的,但是没有像这个呢。
Dani

实体框架功能当前位于CTP5中。我猜应该在2011年第一季度发布RTM版本。因此希望它包含Lambda表达式包含的Include,但是我还没有检查它的实现,所以我不能说它是否使用任何类型的缓存。
Ladislav Mrnka 2010年

31
从EF 4.3.x开始,此答案是错误的。其他答案是正确的,必须使用System.Data.Entity来获得lamda表达式的重载。
埃里克·J

1
@EricJ:是的。从EF 4.1开始,强类型的包含可用。
拉迪斯拉夫·姆恩卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.