【发布时间】:2011-12-16 13:41:23
【问题描述】:
我有这个问题
var test = context.Assignments
.Include(a => a.Customer)
.Include(a => a.Subscriptions)
.Select(a => new AssignmentWithSubscriptionCount { SubscriptionCount = a.Subscriptions.Count(), Assignment = a })
.ToList();
var name = test.First().Assignment.Customer.Name;
它无法急切地加载客户,我在 stackoverflow 上看到了类似的问题,看起来你不能使用包含的投影。但是我还没有找到解决我的问题的方法。。有人吗?
编辑:这是一个有效的投影负载,它比上面的示例更复杂,所以我无法理解有什么问题,谢谢。
var test = context.PublicationStateGroups
.Include(p => p.PublicationStates.Select(ps => ps.AllowedPublicationStateActions.Select(aps => aps.PublicationStateAction)))
.Select(psg => new StateAndGroupInfo
{
ShowReport = psg.PublicationStates.Any(p => p.PublicationStateReportTypeId.HasValue),
Actions = psg.PublicationStates.SelectMany(state => state.AllowedPublicationStateActions)
.Select(a => a.PublicationStateAction)
.Distinct()
}).ToList();
var eagerTest = test.First().Actions.First().Name;
【问题讨论】:
-
第二个示例与您的第一个示例不同。在第二个中,您只能访问
Actions集合中的一个元素,该元素直接是您的投影对象中的一个成员。首先,您尝试访问投影成员Assignment上的导航属性Assignment.Customer,但这是行不通的。您可以在两个示例中删除Include,它不会改变任何内容。 -
啊,那是正确的 :D 所以你告诉我 EF 是一个如此不成熟的产品,我不能这样做并保持映射对象上的关系?我告诉我的团队成员我们应该选择 nHibernate,但他们不想听:/
-
是的,据我所知,不支持投影中的
Include。 MS似乎也证实了这一点(见下面拉迪斯拉夫的回答)。我的回答只是一种解决方法。
标签: include entity-framework-4.1 projection