2011-12-16 5 views
2

EF4のC#ラムダ式でブール値を比較する方法はわかりません。Lambda式は、NotSupportedExceptionでbooleanをfalseと比較します。

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. 

を私はまだ何かが不足しているこれを研究している時間g。私はかなり新しくLambdasだから、pointersが分かるだろう。

EDIT2:より多くのコードの再:コメント

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); 

それです。私はORDERBYを削除しても、それはまだ

EDIT3を動作しません:

ソリューション:

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

このエラーは、おそらくステートメントの他の部分にあります。呼び出しを行う行の残りの部分とスタックトレースからさらにいくつかのフレームを投稿できますか? – dasblinkenlight

+0

@dasblinkenlightが言っていることは正しいです。最初の2つのメソッドは、EF 4のブール値を比較するために正常に動作します –

+0

すばやい応答のためにありがとう@dasblinkenlight周囲のコードとスタックトレースの一部を追加しました – Eonasdan

答えて

3

問題がc.baz.Equals(bar)ラインで最も可能性が高いです。あなたは

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

に変更した場合は、IQueryable<T>の評価を強制するので、あなたは、その行にスローされた例外が表示されるはずです。

代わりにオブジェクトを比較するのは、このように、自分のIDを比較する必要があります。

Receivedの種類は何

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

linqのオブジェクトを比較できますか?そのdatacontextの同じインスタンスからの場合。 – Niklas

+0

@dasblinkenlightがコードを編集し直しました。Barはint変数です。これはあなたのコードに影響を及ぼしますか? – Eonasdan

+0

@Niklas 'IEnumerable 'に変換するまで、それはまだLINQではありません:EFの世界では、 'IQueryable 'がSQLに変換されます。 – dasblinkenlight

0

(OPへのコメントや変更で会話を反映するように編集) ? Where closeリスト内のすべての要素を処理し、条件を満たすものを返すためには、述語(Booleanを返す関数)が必要です。エラーメッセージからは、プリミティブタイプではないと思われます。Receivedブール値が分かっていれば、ブール値にキャストする必要があります。

関連する問題