【问题标题】:Cannot resolve method between Enumerable and Queryable candidates无法解析 Enumerable 和 Queryable 候选者之间的方法
【发布时间】:2015-04-24 19:57:42
【问题描述】:

我在一个名为 Invoice 的类中有这个方法:

public static Expression<Func<Invoice, bool>> IsAllocated()
{
    return i => i.TotalAmountDue == i.GetAllocationsTotal();
}

我有一个这样的列表:

IQueryable<Invoice> invoices

我需要像这样过滤它(它是 Linq to Entity):

var filteredInvoices = invoices.Where(i => Invoice.IsAllocated());

在这一行中,我遇到了两个错误:

无法解析方法 ... 候选者是 .... 一个在 Enumerable 中,另一个在 Queryable 中。

还有:

无法将表达式类型Expression&lt;Func&lt;Invoice,bool&gt;&gt; 转换为 返回类型“布尔”

我尝试了很多我在 SO 中找到的东西,但都没有运气。有人可以告诉我这里缺少什么,或者至少,这两个错误中的哪一个是问题的根源?

【问题讨论】:

  • 我会说下一个障碍将是i.GetAllocationsTotal() :-)
  • @xanatos 你是 100% 正确的 :)
  • 对于其他登陆这里的谷歌用户,请确保您在 lambda 中使用的是 == 而不是 =

标签: c# lambda linq-to-entities


【解决方案1】:

您的方法已经返回了适当的表达式树 - 您只需要调用它,而不是在 lambda 表达式中调用它

var filteredInvoices = invoices.Where(Invoice.IsAllocated());

【讨论】:

  • 就是这样,现在我离理解Lambda表达式又近了一步。谢谢。
【解决方案2】:

表达式是表示,而不是代表本身。你应该先用它创建一个委托

static Expression<Func<Invoice, bool>> IsAllocatedExpr()
{
    return i => i.TotalAmountDue == i.GetAllocationsTotal();
}

public static Func<Invoice, bool> IsAllocated = IsAllocatedExpr().Compile();

然后

var filteredInvoices = invoices.Where(i => Invoice.IsAllocated(i));

【讨论】:

  • 不,OP 想要它作为表达式树 - 关键是将表达式树传递给 LINQ 提供程序以在数据库中进行过滤。
  • 啊,你又来了....这里需要用隐形墨水写的表达式树。在这个问题上看不到..
  • 好吧,如果 OP 确实 只想要一个委托,他们为什么还要麻烦制作一个表达式树?他们为什么要在不需要时强制在客户端执行查询?考虑到我们拥有的上下文(EF 和IQueryable&lt;T&gt;...),这根本没有任何意义
  • @JonSkeet 你说得对,这项任务的所有复杂性都来自于使用 Linq to Entities 的需要,因此工作在数据库服务器中完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2019-02-14
  • 2021-08-28
相关资源
最近更新 更多