【问题标题】:LinqKit PredicateBuilder adding to linq queryLinqKit PredicateBuilder 添加到 linq 查询
【发布时间】:2015-03-10 17:40:36
【问题描述】:

我有一个 linq 查询,我想添加一些额外的可选 WHERE 条件来使用 LinqKit 谓词生成器。但是,我很难让额外的谓词起作用

这是我的初始查询:

var query = (from OP in ctx.OrganisationProducts
             where OP.OrganisationID == orgID
             orderby OP.Product.Name, OP.Product.VersionName
             select OP).Include("Product");

如您所见,其中有JOIN。 然后,如果需要,我希望添加其他谓词:

if(!includeDisabledP42Admin || !includeDisabledOrgAdmin)
{
    var pred = PredicateBuilder.True<OrganisationProduct>();
    if (!includeDisabledP42Admin)
        pred.And(op => op.Enabled);
    if (!includeDisabledOrgAdmin)
        pred.And(op => op.AccessLevel == "NA" || op.AccessLevel == "NU");
    query = query.Where(pred);
}

但是,生成的 SQL 不变,查询返回的行数相同。

我想我可能不得不像这样进行扩展转换:

query = query.AsExpandable().Where(pred);

但这会导致运行时错误。

我认为问题在于我将谓词添加到已经不再OrganisationProduct对象的查询中,但是我想就如何在正确的地方。

谢谢大家 :-)

【问题讨论】:

    标签: linq predicatebuilder linqkit


    【解决方案1】:

    您必须将And 的返回值分配给谓词:

    pred = pred.And(op => op.Enabled);
    

    旁注:您可能喜欢this predicate builder,它可以在没有Expand/AsExpandable 的情况下工作,但语法相同。

    【讨论】:

    • 噢!谢谢!业余错误。每个pred 大概是不可变的。
    • 感谢您对通用 PredicateBuilder 的关注。
    • 也许我有点急切。更改 pred = pred.And 现在会导致运行时错误:"The LINQ expression node type 'Invoke' is not supported in LINQ to Entities."
    • 这就是 Linqkit 中 Expand 或 AsExpandable 的用途。但是没有它,其他谓词构建器也可以工作。
    • 哇!那行得通!仍然不知道为什么,但我检查了生成的 SQL,这是我所期望的。竖起大拇指Universal Predicate Builder
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多