And*_*ers 3 projection include entity-framework-4.1
我有这个问题
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;
Run Code Online (Sandbox Code Playgroud)
它急于加载客户,我在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;
Run Code Online (Sandbox Code Playgroud)
将客户添加到您的预测中:
var test = context.Assignments
.Select(a => new AssignmentWithSubscriptionCount
{
SubscriptionCount = a.Subscriptions.Count(),
Assignment = a,
Customer = a.Customer
});
var name = test.First().Customer.Name;
Run Code Online (Sandbox Code Playgroud)
EF上下文可能会确保Assignment.Customer自动填充.
编辑
如果您不想或不能更改AssignmentWithSubscriptionCount类,您也可以投影到匿名类型,然后将结果复制到内存中:
var test = context.Assignments
.Select(a => new
{
SubscriptionCount = a.Subscriptions.Count(),
Assignment = a,
Customer = a.Customer
});
test.ToList() // executes query
.Select(o =>
{
o.Assignment.Customer = o.Customer;
return new AssignmentWithSubscriptionCount
{
SubscriptionCount = o.SubscriptionCount,
Assignment = o.Assignment
}
});
Run Code Online (Sandbox Code Playgroud)
另一种选择是明确加载(Assignment虽然每次加载需要一次额外的往返).