1

NHibernate の LINQ プロバイダーを使用して動的クエリを作成しようとしていますが、問題が発生しています。私の理解では、LINQクエリは呼び出されるまで(つまり、ToList()で)延期されたので、次のコードがあります。

string[] filteredIds = new[] { "someIdNotInUse"};

var result = _products
    .GetAll()
    .Skip(0)
    .Take(10);

if (filteredIds != null) 
{
    result.Where(x => x.Child1.Child2.Any(z => filteredIds.Contains(z.Child3.Id)));
}

var r = result.ToList();

条件ブロックの Where フィルターは適用されません。.ToList を実行すると、予期しないレコードが取得されます。ただし、where フィルターを削除して _products 呼び出しに直接追加すると、期待どおりに機能します。LINQ プロバイダーの仕組みを誤解していますか? 考えられるすべてのフィルター条件と組み合わせに対してクエリを書き直すことなく、このようなクエリを作成するにはどうすればよいでしょうか?

4

1 に答える 1

5

LINQ のメソッドは、呼び出されたオブジェクトには影響しません。呼び出しの結果を表す新しいオブジェクトを返します。あなたが望んでいるのは:

if (filteredIds != null) 
{
    result = result.Where(...);
}

Replace(呼び出しや文字列に少し似ていると考えてくださいTrim。文字列は不変であるため、重要なのは戻り値だけです。)

于 2012-07-30T12:51:05.620 に答える