0

今日、これを行うと次のことに気付きました。

var items = context.items.Where(i => i.Property < 2);
items = items.Where(i => i.Property > 4);

items var にアクセスすると、データ呼び出しとして最初の行のみが実行され、メモリ内で 2 番目の呼び出しが実行されます。ただし、これを行うと:

var items = context.items.Where(i => i.Property < 2).Where(i => i.Property > 4);

両方の where ステートメントを含むコンテキストに対して実行される式は 1 つだけです。linq ラムダの式を作成するために使用したい多くの変数がありますが、それらの有無によって式が変化するため、すべてのケースを満たすにはばかげた数の条件が必要になります。上記の最初の例のように Where() ステートメントを追加できると思っていましたが、すべての基準を含む単一の式にはなりません。したがって、私はラムダ自体をそのまま作成しようとしています:

//bogus syntax
if (var1 == "something")
    var expression = Expression<Func<item, bool>>(i => i.Property == "Something);
if (var2 == "somethingElse")
    expression = expression.Where(i => i.Property2 == "SomethingElse");

そして、それを context.Items to evaluate の場所に渡します。A) そうですか、B) もしそうなら、どのようにしますか?

編集:

IQueryable assessments = assessmentContext.Assessments;
metAssessments = metAssessments.Take(pageSize);

結果は

SELECT [Fields] <== edited
FROM [dbo].[Assessment] AS [t0]
INNER JOIN [dbo].[AssessmentComment] AS [t1] ON [t1].[ID] = [t0].[AssessmentID] <== because of load options

トップ x (pageSize で表される) がないのはなぜですか?

4

3 に答える 3

2

どのクエリ プロバイダーを使用していますか? 合理的なプロバイダーの場合、最初の例は、各 の 2 つの条件の結合として (メモリ内ではなく) ソース上で実行する必要がありますWhere

Expressionあなたの質問に関しては、いいえ、それは手動でビルドする正しい方法ではありません。最初の定義は問題ありませんが、接続詞を作成するには を使用する必要がありますExpression.AndAlso

人々はすでにこれをあなたの使用のためにライブラリにラップしています. PredicateBuilderを参照してください。

于 2011-01-03T16:53:49.213 に答える
0

PredicateBuilderを使用して、クエリを動的に構築します。

于 2011-01-03T16:54:31.333 に答える
0

1 番目と 2 番目が異なる理由は、itemsその時点で既にデータにアクセスしているためだと思います。itemsオブジェクトを継承させるIQueryableと、コレクション内のアイテムに実際にアクセスするまで、コンテキストに対して実際には何も実行されません。

于 2011-01-03T16:55:20.910 に答える