我实例化了一个上下文,想要编写一个简单的查询:
var result = db.Set.Where(x => x.Id == num).Select(whatever);
我无法摆脱Where
下抱怨System.Collections.Generic.IEnumerable
和System.Linq.IQueryable.
System.Linq
之间的模糊调用的红色波浪形,并且{{1}在项目中的任何地方都没有引用。如何告诉我要使用的代码System.Collections.Generic
?
答案 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。添加引用可以解决这种情况下的错误。