实体框架 - 通过集合导航和包含属性

djd*_*d87 8 linq-to-entities code-first entity-framework-4 c#-4.0

我刚刚有一个巨大的*金发时刻**,但它突出了我对Entity Framework的烦恼.我已经禁用了延迟加载,因此我强迫自己实际考虑我需要哪些数据以尽可能快地保持应用程序.

因此,为了在查询中返回数据,我需要使用该Include方法:

var query = from item in context.Customers
                .Include(x=> x.Orders)
            select item
Run Code Online (Sandbox Code Playgroud)

这是好的,直到我想在层次结构中更深入地选择一个项目.即:

Customer 1-* Orders *-1 Factory 1-1 Factory Type
Run Code Online (Sandbox Code Playgroud)

据我所知,热切返回所有这些数据的唯一方法是执行以下操作:

var query = from item in context.Customers
                .Include("Orders.Factory.FactoryType")
            select item
Run Code Online (Sandbox Code Playgroud)

有了上述内容,我无法System.Data.Entity按照我的第一个例子使用Lambdas.有没有人知道我在这里是否遗漏了一些明显的东西,还是我坚持使用字符串声明通过集合导航属性?

如果我没有任何收藏品,我可以写:

.Include(x=> x.Order.OrderType.Factory.FactoryType) // No bother
Run Code Online (Sandbox Code Playgroud)

但是由于Orders收集,就我所知FirstOrDefault,没有办法直接进入儿童财产(SingleOrDefault等等,不起作用).


**这只是一个转折,我碰巧非常喜欢金发*

Mor*_*avi 14

要包含EntityCollections,请使用Select方法:

var query = from item in context.Customers
           .Include(c => c.Orders.Select(o => o.Factory.FactoryType))
           select item
Run Code Online (Sandbox Code Playgroud)

请注意,这不是标准ObjectQuery <T> .Include方法的重载,而只是与EF CTP4一起使用的ObjectQuery <T>类的扩展方法.