Lambda表达式将布尔值比较为NotSupportedException中的false结果

时间:2011-12-16 16:10:16

标签: c# entity-framework lambda

我似乎无法弄清楚如何比较EF4的C#lambda表达式中的布尔值。我试过了:

cl.Where(c => c.Received == false);

和此:

cl.Where(c => !c.Received);

和此:

cl.Where(c => c.Received.Equals(false));

但我一直收到这个错误:

Exception Details: System.NotSupportedException: Unable to create a constant value
of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid')
are supported in this context.

在花了很多时间研究这个之后,我仍然缺少一些东西。我对Lambdas很新,所以pointers会受到赞赏。

编辑2:更多代码:评论

int bar = 42;
var cl = db.foo.Where(c => c.baz.Equals(bar));
//codez (just an if statement)
cl.Where(c => c.Received == false).OrderByDescending(c => c.dateAdded);

就是这样。即使我删除了它仍然无法正常工作

EDIT3:

解决方案:

int bar = 42;
var cl = db.foo.Where(c => c.baz == bar);
cl.Where(c => c.Received == false).OrderByDescending(c => c.dateAdded);

2 个答案:

答案 0 :(得分:3)

问题最有可能发生在c.baz.Equals(bar)行。如果将其更改为

var cl = db.foo.Where(c => c.baz.Equals(bar)).ToList();

你应该看到在该行上抛出的异常,因为你强制评估IQueryable<T>

您应该比较它们的ID,而不是比较对象,如下所示:

(编辑以反映评论中的对话和对OP的更改)

var cl = db.foo.Where(c => c.baz == bar.id);

答案 1 :(得分:0)

Received的类型是什么? Where close需要一个谓词(一个返回布尔值的函数),以便对列表中的每个元素进行操作并返回满足条件的那些元素。从错误消息看,Received似乎不是基本类型。如果你肯定知道它的布尔值,你需要将它强制转换为布尔值。