模糊调用IQueryable或IEnumerable

时间:2013-11-08 21:59:18

标签: linq entity-framework

我实例化了一个上下文,想要编写一个简单的查询:

var result = db.Set.Where(x => x.Id == num).Select(whatever);

我无法摆脱Where下抱怨System.Collections.Generic.IEnumerableSystem.Linq.IQueryable. System.Linq之间的模糊调用的红色波浪形,并且{{1}在项目中的任何地方都没有引用。如何告诉我要使用的代码System.Collections.Generic

5 个答案:

答案 0 :(得分:35)

此问题通常是由提供给Where语句的表达式中的类型推断失败引起的。正如上面的评论中所提到的,它是100%由lambda中的赋值运算符返回int而不是bool引起的。

要明确 - 你在哪里

var result = db.Set.Where(x => x.Id = num).Select(whatever);

你应该

var result = db.Set.Where(x => x.Id == num).Select(whatever);

另一个好的(也是更常见的)例子是这样的

public class Elem 
{
    public bool IsSomething {get;set;}                    
    public bool? IsSomethingElse {get;set;}
}

然后,如果你执行以下查询,一看起来看起来非常合理,它将无法用“abiguous invocation”这个令人费解的错误进行编译

IQueryable<Elem> queryable = GetQueryable();
var result = queryable.Where(e => e.IsSomething && e.IsSomethingElse).ToList();

如果你没有在lambda中写这个语句,那么你会得到一个更有意义的错误

  

“无法应用运营商”&amp;&amp;'到'System.Nullable&lt; bool&gt;'类型的操作数和'bool'“

哪会立刻告诉你你没有返回布尔值。

答案 1 :(得分:2)

许多人会遇到的问题是因为IQueryable继承自IEnumerable,并且它们都有自己的各种LINQ语句的实现。

里斯的回答涵盖了另一种情况。如果你实现我在下面说的话,并且仍然收到错误,那么你可能正在遇到他的情况。

This answer显示IEnumerable和IQueryable之间的差异。 This article解释了.AsQueryable()有什么用处。

对于这个特定问题,.AsQueryable()不是正确的方法,因为其目的主要是将IEnumerables转换为伪可查询。执行此操作的正确方法是向编译器明确说明您的对象是什么。

IQueryable<whateverSet> dbSet = db.Set;
var result = dbSet.Where(x => x.Id == num).Select(whatever);

这告诉编译器显式的是什么dbSet,而不是像.AsQueryable()那样尝试执行cast语句。

在C#3.0中添加var对于来自PHP之类的松散类型语言的人来说非常棒,但是它让人们认为编译器总是能够直接识别出来#34 ;。很多时候情况并非如此,铸造不是解决方案。

答案 2 :(得分:0)

知道了。人们似乎不喜欢这个答案,但它解决了我在问题中描述的问题。

db.Set.AsQueryable().Where(...

答案 3 :(得分:0)

我遇到了这个问题-就我而言,模型与调用代码位于单独的项目中。 调用代码没有对EF的引用。 在调用项目时添加对EF的引用已为我修复。

答案 4 :(得分:0)

在我的特定情况下,我遇到了相同的错误,但原因没有引用System.Linq。添加引用可以解决这种情况下的错误。