2

在 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);

问题:

  1. 该函数可以编译,但是当我调用它时:“无法从用法中推断出方法的类型参数。尝试明确指定类型参数。” 我究竟做错了什么?
  2. 如果我让它工作,我可以Include()第一次调用:var customers = FindAll(q => q.Orders, q => q.Invoices);然后在一个单独的步骤中再次调用:customers = customers.Include(p => p.Invoices);还是会导致性能不佳,以至于我应该一次性完成包含?

编辑:
当然,JonSkeet 的回答是正确的,但是有这个解决方案似乎可以满足我的要求。不知道为什么它会起作用。是因为Aggregate()功能吗?

4

1 回答 1

4

从根本上说,我认为你有一个问题 - 假设q.Orders,q.Invoicesq.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);

我想说这更清楚它解决了“多类型参数”问题。

于 2012-10-24T11:49:57.703 回答