0

少なくとも1つを返す必要があることがわかっているのに、結果を返さないLINQクエリがあります。クエリを動的に構築しています。すべての結果をフィルターで除外する行に到達する直前に、デバッガーで結果セットを確認しました。この行には数百の行が含まれています。この行の後には、実際に少なくとも1つ含まれている必要があるときに0が含まれています。

query = query.Where(x => 
    x.Lineages.FirstOrDefault().Sire.Contains(options.PedigreeContains));

この場合の「x」は「Horse」と呼ばれるエンティティを表します。'options.PedigreeContains'は単なる文字列値です。Lineagesテーブルは次のようになります。

ID         HorseID         Sire       Dam        etc...

デバッガーでHorseエンティティ(結果として返されるはずのエンティティ)をプルアップし、Lineagesプロパティを調べて、検索に一致するSire値を含めて完全に入力されていることを確認することもできます。したがって、私が使用しているLINQクエリに明らかに問題があることを除いて、すべてのSEEMSが機能しているはずです。

誰かが私がしていることに本質的に間違っているのを見ますか?それは私がそこにあるべきであると私が知っている結果をフィルターで取り除く原因になりますか?

編集:明確にするために、それは1対1の関係です。Lineagesオブジェクトが存在すること、1つしかないこと、そしてそれが一致することを知っています。なんらかの理由でゼロの結果が返されるので、クエリの記述方法に問題があるのではないかと思いました。そのクエリが記述されたとおりに機能する必要がある場合(系統が存在しない場合、複数の系統が存在する場合など、余分な「可能性」をすべて除く)、コードのどこかで問題になっているはずです。

4

4 に答える 4

1

FirstOrDefault「デフォルト」を返す場合はどうなりますか?を取得しNullReferenceExceptionます。

于 2013-01-12T02:44:16.957 に答える
1

実際にあなたの質問に答えてください:いいえ。クエリに本質的に問題はありません。クエリの構築、データベース構造、またはデータのどこかで問題が発生している必要があります。

デバッグするときは、結果カウントを列挙して検証する代わりに、query式の値をコピーして、生成された SQL がどのように見えるかを調べます。を変更する前と後にそれを行うことができますIQueryable query。@Jalalx のような他の提案 .Any() を使用して、@John Saunders の指摘を回避します。

于 2013-01-13T20:56:30.127 に答える
1

Lineages返された最初のものに目的の内容Sireが含まれていない場合、を注文する手段を提供していませんoption.PedigreeContainsSireこのような場合、 内の他のに関係なく、結果セットは空になりLineagesます。

于 2013-01-12T02:51:05.887 に答える
0

あなたがそれを持っているところでFirstOrDefault()をするなら、あなたは多くの種雄牛であるかもしれないものの最初のものをとっていませんか?

query = query.Where(x => 
    x.Lineages.FirstOrDefault(lineage => lineage.Sire.Contains(options.PedigreeContains))).Sire;
于 2013-01-12T02:49:28.620 に答える