Predicate Builder根据其他谓词删除谓词

时间:2014-10-29 20:04:42

标签: c# nested predicatebuilder

我有一些具有IsDeleted(逻辑删除)属性的实体,当我进行查询时,标准将返回除已删除的所有实体,例如:

var query = collection.Where(e=> !e.IsDeleted);

我正在使用谓词构建器来创建一些谓词以供重用,所以我有这样的搜索:

    public static Func<FakeEntity, bool> ContainsName(string keyword) {
        var predicate = NotDeleted();
        predicate = predicate.And(e => e.Name.Contains(keyword));
        return predicate;
    }

NotDeleted()谓词:

    public static Func<FakeEntity, bool> NotDeleted() {
        var predicate = PredicateBuilderDelegate.True<FakeEntity>();
        predicate = predicate.And(e => !e.IsDeleted);
        return predicate;
    }

我想要的是创建另一个谓词'覆盖'某些NotDeleted()的谓词,所以在代码中我可以调用:

var result = collection.Where(FakeEntity.ContainsName("keyword")
                         .And(FakeEntity.IncludeDeleted()));

除此之外的想法是当我使用ContainsName它返回包含该字符串但未删除的所有实体时,但我想要某种方式明确地说要包括那些已删除的那些。

清楚吗?

我没有运气的尝试是:

    public static Func<FakeEntity, bool> IncludeDeleted() {
        var predicate = PredicateBuilderDelegate.True<FakeEntity>();
        predicate = predicate.And(e => e.IsDeleted);
        return predicate;
    }

1 个答案:

答案 0 :(得分:0)

根本不可能完全你想要的东西。您需要进行某种更重要的重新设计才能实现。

从根本上说,如果你想构建一个谓词,你不应该添加你不想在那里的表达式,而不是添加它们并试图稍后将它们拉回来。在您的情况下,这意味着,只要您想要过滤名称包含值的项目,就不会无条件地过滤掉已删除的项目。如果您的要求声明他们有时需要分开,请将这两项操作分开。