我在使用EF和Predicate Builder时遇到问题。我已经看完所有说明,并且可以肯定我做的一切都正确,但是当我运行SQL Profiler并检查去往数据库的查询时,它会忽略我的谓词并获取表中的每条记录,而这表目前最多可容纳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上的嵌套谓词
这是正在生成的SQL:
SELECT
[Extent1].[ListRecordId] AS [ListRecordId],
[Extent1].[Community] AS [Community]
-- And every other column from this table
FROM [dbo].[ListRecord] AS [Extent1]
我认为您不需要创建的第一个谓词。这样会不会返回您需要的结果?
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句