2011-10-02 7 views
1

私は次のクエリを持っている:WHERE単純なLINQクエリに追加すると、ゼロの結果を返します(ただし、いけない)

var Query = db.ReportCommon 
       .Where(x => x.ReportType == category) 
       .Where(x => x.ReportDateTime >= dateStart) 
       .Where(x => x.ReportDateTime < dateEnd); 

categoryは、私は(つまり、「ショート」に渡す変数であり、「標準'など)。 dateStartおよびdateEndは、DateTime値です。

このクエリは、期待どおりの結果を返します(約300奇数)。

しかし、私は実際に私は約2または3以下の結果を得る必要があるとき、私はゼロの結果を得る次の行を追加するとき:

   .Where(x => x.PartnerRef.ToUpper() != "TEST"); 

PartnerRefフィールドが「テスト」を含んでいないだけで約3エントリがあります。または 'test'または 'TEST'の場合、他のものはNULLか、異なるパートナー参照(「DSW」など)を含んでいます。

なぜこのようなことが起こり、どうすれば解決できますか?

+0

「db」とは何ですか? (つまり、どのLINQプロバイダを使用していますか?) – dtb

+0

dbは私のエンティティコンテキストです プライベートOnlineReportingEntityContext db = new OnlineReportingEntityContext(); – ChrisCurrie

+0

SQLプロバイダから直接、期待している行についての情報を提供してもらえますか?おそらく、PartnerRefフィールドには、あなたが期待しているものとはあまり合わないものがあります。 – doctorless

答えて

0

あなたのコードで何が起こっているのかよく分かりません。 ただし、特定のエントリ「PartnerRef」がnullの場合、PartnerRef.ToUpper()はnull参照例外をスローします。

あなたはその例外をどこかで処理していても、クエリは実行されなかったので結果は空のままですか?

+0

ありがとうございます。 私はたくさんのNULLエントリを持っています、はい。しかし、たとえ私がToUpper()を削除しても、私はまだ同じ問題を抱えています... – ChrisCurrie

+0

Linq to SQL QueryProviderでクエリを評価するなら、NREを取得しません。 – Guillaume86

1

category,dateStart、およびdateEndの値は同じですか?あなたは

.Where(x => x.PartnerRef.ToUpper() == "TEST"); 

を使用する場合

また、あなたが期待する2つのまたは3のレコードが入手できますか?

これをLINQPadで実行すると、EFが生成しているSQLを試して見ることができます。

+0

これらの提案に私のやり方を働かせてください...私があなたの提案を使うなら、私は予想した記録を得ます。 LINQPadは面白そうです...私はそれを把握する必要があります。ありがとう。 – ChrisCurrie

0

SQLクエリでは大文字と小文字が区別されないため、LINQ to Databasesでは.ToUpperが必要ありません。生成されたSQLをプロファイリングして、クエリが失敗した理由を調べることができます。引き続きヘルプが必要な場合は、SQLを投稿してください。

+3

これはDBの照合順序に依存します – Magnus

1

生成されたSQLをチェックする必要がありますが、SQL用語ではNULL!= "TEST"はUNKNOWNでTRUEではないと評価され、結果は返されません。

あなたは、この落とし穴を見つけ出し、NULLチェックをSQLに出すのに十分なほど巧妙だと思っているかもしれませんが、あなたの質問のすべてが与えられていないと思われるかもしれません。

他のPartnerRef値が返されない理由を説明することはできません。これは、質問内で特定していない他の外部要因を指しています。

関連する問題