【问题标题】:Entity Framework and Predicate Builder - Predicates being Ignored in SQL Query实体框架和谓词生成器 - SQL 查询中忽略的谓词
【发布时间】:2013-09-23 13:45:09
【问题描述】:

我遇到了 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]

【问题讨论】:

    标签: sql entity-framework predicate predicatebuilder


    【解决方案1】:

    我认为您不需要创建的第一个谓词。这不会返回您需要的结果吗?

    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();
    

    【讨论】:

    • 之所以这样,是因为我在做一个嵌套查询。查看 albahari.com/nutshell/predicatebuilder.aspx 上的嵌套谓词示例
    • 像第二个示例一样拆分谓词并排除 .compile() 并一次添加一个即可完成工作
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多