2

EF と Predicate Builder に問題があります。私はすべての手順を実行しており、すべてが正しく行われていると確信していますが、SQL プロファイラーを実行してデータベースへのクエリを調べると、述語が無視され、テーブル内のすべてのレコードが取得されます。 table は現在最大約 600,000 行であるため、処理が少し遅くなります。データベースがクエリを実行した後、私の述語が適用されます。

誰かが私に欠けているものを教えてもらえますか?

var predicate = PredicateBuilder.True<ListRecord>();

var classFilter = PredicateBuilder.False<ListRecord>();
classFilter = classFilter.Or(x => x.Community == "Air Force");
classFilter = classFilter.Or(x => x.Community == "Navy");
predicate = predicate.And(classFilter);

// Add several more predicates just like classFlter

var query = db.ListRecords.AsExpandable().Where(predicate.Compile());
var list = query.ToList();

私がコピーした例は、http://www.albahari.com/nutshell/predicatebuilder.aspxの Nesting Predicates です。

これは、生成されている SQL です。

SELECT 
[Extent1].[ListRecordId] AS [ListRecordId], 
[Extent1].[Community] AS [Community]
-- And every other column from this table
FROM [dbo].[ListRecord] AS [Extent1]
4

1 に答える 1

3

最初に作成する述語は必要ないと思います。これは必要な結果を返しませんか?

var classFilter = PredicateBuilder.False<ListRecord>();
classFilter = classFilter.Or(x => x.Community == "Air Force");
classFilter = classFilter.Or(x => x.Community == "Navy");

// Add several more predicates just like classFlter

var query = db.ListRecords.AsExpandable().Where(classFilter);
var list = query.ToList();

または、Classfilter のような追加の述語を使用します。

var classFilter = PredicateBuilder.False<ListRecord>();
classFilter = classFilter.Or(x => x.Community == "Air Force");
classFilter = classFilter.Or(x => x.Community == "Navy");

var list = db.ListRecords.AsExpandable()
    .Where(classFilter)
    .Where(someOtherFilterLikeClassFilter)
    .Where(AnotherOneLikeClassFilter)
    .ToList();
于 2013-09-23T14:16:53.537 に答える