使用linq表达式的params数组

时间:2012-10-24 11:46:42

标签: c# linq entity-framework linq-expressions

在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);:或者会导致效果不佳,我应该一次性做包括吗?
  3. 修改
    当然,JonSkeet的回答是正确的,但there is this solution似乎做了我想做的事。不知道为什么它有效。是因为Aggregate()函数吗?

1 个答案:

答案 0 :(得分:4)

从根本上说,我认为你遇到了问题 - 假设q.Ordersq.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);

我会说更明确的它会解决“多类型参数”问题。