模糊调用IQueryable或IEnumerable

pth*_*ker 28 linq entity-framework

我实例化一个上下文,并希望编写一个简单的查询

var result = db.Set.Where(x => x.Id == num).Select(whatever);
Run Code Online (Sandbox Code Playgroud)

而且我无法摆脱"Where"抱怨System.Collections.Generic.IEnumerable和System.Linq.IQueryable之间模糊调用的红色波浪形.System.Linq是专门引用的,System.Collections.Generic不会在项目中的任何位置引用.如何告诉代码我想使用System.Linq.IQueryable?

帕梅拉

Rhy*_*qua 36

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

要清楚 - 你在哪里

var result = db.Set.Where(x => x.Id = num).Select(whatever);
Run Code Online (Sandbox Code Playgroud)

你应该有

var result = db.Set.Where(x => x.Id == num).Select(whatever);
Run Code Online (Sandbox Code Playgroud)

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

public class Elem 
{
    public bool IsSomething {get;set;}                    
    public bool? IsSomethingElse {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后,如果你做下面的查询,它看起来在拳头一目了然非常合理的,它会失败,出现"abiguous调用"的,而令人费解的错误编译

IQueryable<Elem> queryable = GetQueryable();
var result = queryable.Where(e => e.IsSomething && e.IsSomethingElse).ToList();
Run Code Online (Sandbox Code Playgroud)

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

"无法将运算符'&&'应用于'System.Nullable <bool>'和'bool'类型的操作数"

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


pth*_*ker 2

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

db.Set.AsQueryable().Where(...
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不会对代码进行功能更改,AsQueryable 的实现会测试源是否已可查询 - 如果是,则将其转换为 IQueryable&lt;T&gt; 并返回它。 (2认同)
  • 它可能不会更改代码,但它消除了导致我的问题的歧义。 (2认同)
  • 尽管投了反对票,这个答案还是解决了我的红色波浪问题。 (2认同)