31

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

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

我无法摆脱红色波浪线,因为我Where抱怨System.Collections.Generic.IEnumerable和之间的模糊调用System.Linq.IQueryable. System.Linq被特别引用,并且System.Collections.Generic在项目的任何地方都没有被引用。如何告诉我要使用的代码System.Linq.IQueryable

4

5 回答 5

41

此问题通常是由提供给 Where 语句的表达式中的类型推断失败引起的。正如上面的评论中提到的,它 100% 是由 lambda 中的赋值运算符返回 anint而不是 a 引起的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;}
}

那么如果你做下面这个乍一看很合理的查询,它就会编译失败,出现“模糊调用”这个相当令人费解的错误

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

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

“不能将运算符 '&&' 应用于 'System.Nullable<bool>' 和 'bool' 类型的操作数”

这会立即告诉您您没有返回布尔值。

于 2014-04-16T04:13:52.833 回答
2

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

db.Set.AsQueryable().Where(...
于 2013-11-08T22:36:17.427 回答
2

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

里斯的回答涵盖了另一种情况。如果您执行我在下面所说的内容,但仍然收到错误,那么您可能遇到了他的情况。

这个答案显示了 IEnumerable 和 IQueryable 之间的区别。这篇文章解释了什么.AsQueryable()是好的。

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

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

这是在告诉编译器 dbSet 是什么,而不是像.AsQueryable().

C# 3.0 中的新增var功能对于来自 PHP 等松散类型语言的人来说非常棒,但是它使人们误以为编译器总是能够“弄清楚”。很多时候情况并非如此,并且铸造不是解决方案。

于 2015-03-20T18:28:22.763 回答
1

我遇到了这个问题 - 在我的情况下,模型与调用代码位于一个单独的项目中。调用代码没有对 EF 的引用。在调用项目中添加对 EF 的引用为我修复了它。

于 2018-11-14T10:30:54.060 回答
0

在我的特殊情况下,我遇到了同样的错误,但原因是没有引用 System.Linq。添加引用修复了这种特殊情况下的错误。

于 2020-08-05T14:41:01.973 回答