在EF中,如果要在查询结果中包含导航属性,请使用Include()
。由于某些查询需要多次调用,我尝试围绕这个概念创建一个通用的包装器:
public IQueryable<T> FindAll<P>(params Expression<Func<T, P>>[] predicates) where P : class {
var entities = AllEntities();
foreach (var p in predicates) entities = entities.Include(p);
return entities;
}
并称之为:
var customers = FindAll(q => q.Orders, q => q.Invoices, q => q.Contacts);
问题:
Include()
:var customers = FindAll(q => q.Orders, q => q.Invoices);
然后再单独调用customers = customers.Include(p => p.Invoices);
:或者会导致效果不佳,我应该一次性做包括吗? 修改
当然,JonSkeet的回答是正确的,但there is this solution似乎做了我想做的事。不知道为什么它有效。是因为Aggregate()
函数吗?
答案 0 :(得分:4)
从根本上说,我认为你遇到了问题 - 假设q.Orders
,q.Invoices
和q.Contacts
返回不同的类型,你无法表达你想要的东西发生。你可能想要之类的东西:
entities.Include<Parent, Order>(p => p.Order);
entities.Include<Parent, Invoice>(p => p.Invoices);
entities.Include<Parent, Contact>(p => p.Contacts);
...所以你想为每个谓词设置P
的不同值。但是你要调用一个方法,为P
提供单一类型的参数。
目前尚不清楚这是否真的给你带来了很多好处......难道你不能写下来:
var customers = AllEntities().Include(q => q.Orders)
.Include(q => q.Invoices)
.Include(q => q.Contacts);
我会说更明确的和它会解决“多类型参数”问题。