1

カテゴリ ID を受け取るメソッドがあり、その後にデフォルトで null に設定されている 2 つのオプションの文字列パラメーターが続きます。

SOに関する他の質問からいくつかの同様の回答を使用してみましたが、どれも役に立ちませんでした。

次のように、linq to EF クエリを機能させようとしています。

いずれかのオプション パラメータに値がある場合は、その値を使用します。それ以外の場合は、Is Null を使用します。

両方のオプションのパラメーターが存在する場合は、これらをクエリの一部として使用するか、eis のみが提供されている場合はいずれかを使用します。ただし、パラメータが追加されていない場合は、カテゴリ ID のみを使用してください。

db の両方のオプション パラメータは、null 許容としてマークされています。

動作しないコードは次のとおりです。

          from c in dtx.Categories
          where c.CategoryId == CatId
         && (string.IsNullOrEmpty(param1) ? c.Param1 == null : c.Param1 == param1)
         && (string.IsNullOrEmpty(param2) ? c.Param2 == null : c.Param2 == Param2)
        select c

2つ試してください:

          from c in dtx.Categories
          where c.CategoryId == CatId
          && (c.Param1 == null ? c.Param1 == null : c.Param1 == param1)
          && (c.Param2 == null ? c.Param2 == null : c.Param2 == param2)
          select c

エラーはスローされませんが、両方のパラメーターが存在しない限り、両方のクエリは常にゼロの結果を返します。

私が試した投稿の1つ: エンティティフレームワークでnull値を照会するにはどうすればよいですか?

4

4 に答える 4

2

私が知る限り、問題はクエリの条件が正しく記述されていないように見えます。例で何が追加されるかを確認してみましょう:

データ:

Id = 1, Param1 = null, Param2 = null
Id = 2, Param1 = 'a'   param2 = null
Id = 3, Param1 = null, Param2 = 'b'
Id = 4, Param1 = 'a'   param2 = 'c'

現在のクエリと提案された他のソリューションでは、ID 1 のみを取得します。条件は、次のように言っています。

必要なのは、「Param1 Is Null OR c.Param1 Is Equal to Param1 value」という条件です。

このクエリを使用すると、常に結果が得られます。

from c in dtx.Categories
where c.CategoryId == CatId
    && (string.IsNullOrEmpty(param1) || c.Param1 == param1)
    && (string.IsNullOrEmpty(param2) || c.Param2 == param2)
select c
于 2012-05-24T18:36:36.077 に答える
1

運が良ければ3回目の編集です。今回は質問を正しく読んだかもしれません:)

var p1 = string.IsNullOrEmpty(param1) ? null : param1;
var p2 = string.IsNullOrEmpty(param2) ? null : param2;

var query = dtx.Categories.Where(c => c.CategoryId == CatId);
if (p1 != null || p2 != null) {
    query = query.Where(c => c.Param1 == p1 && c.Param2 == p2);
}
于 2012-05-24T17:59:45.130 に答える
0

チェックを明示的に展開する必要があります。両方であるnullか、一致するかのいずれかです

((string.IsNullOrEmpty(param1) && c.Param1 == null) || (c.Param1 == param1))

null編集:テストしたばかりで、SQLが同じかどうかをチェックするかどうかは関係ありません。

from c in dtx.Categories 
    where c.CategoryId == CatId 
       && (c.Param1 == param1) 
       && (c.Param2 == Param2) 
select c 
于 2012-05-24T17:58:21.820 に答える