1

今日、Linq-To-Entitites クエリの 1 つで null ref 例外に出くわし、どうしてそれが可能なのか疑問に思いました。OR ゲートとして使用される条件付き OR は、Linq-To-Entities では効果がないようです。私のクエリの簡単な例は次のとおりです。

from a in db.Articles
where a.Author == "John Doe"
&& (tag == null || a.Tags.Any(t => t.TagName == tag.TagName))
select a;

tag が NULL の場合でも、where クエリの右側が実行され、tag.TagName で NULL 参照例外が発生します。これは、Linq-To-Entities が常に完全なステートメントを SQL に変換するためでしょうか?

とにかく...この問題を回避するにはどうすればよいですか?

どうもありがとう :)

4

2 に答える 2

3
var query = db.Articles.Where(x => x.Author == "John Doe");
query = tag == null
    ? query
    : query.Where(x => x.TagName == tag.TagName);

また:

var query = from a in db.Articles
            where a.Author == "John Doe"
            select a;

    query = tag == null
        ? query
        : from a in query
            where a.Tags.Any(t => t.TagName == tag.TagName)
            select a;

個人的には、最初のほうがきれいだと思います

于 2013-03-31T13:11:07.780 に答える
1

SQLについて考えてみましょう。Linq は、コード全体を '外部' オブジェクトをパラメーターとして渡し、それらを評価する SQL クエリに変換します。そのため、オブジェクトの評価に失敗しnullます。

結果のクエリで不要なコードの数を減らすために、条件に基づいて linq クエリを少しずつ作成することをお勧めします。そのため、クエリを分割することをお勧めします。

var query = db.Articles.Where(x => x.Author == "John Doe");
if( tag != null)
  query = query.Where(x => x.TagName == tag.TagName);

クエリは選択時に評価および実行されるため、複数のリクエストについて心配することなく条件を追加できます。

于 2013-03-31T13:28:45.083 に答える