我有一些具有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;
}
答案 0 :(得分:0)
根本不可能完全你想要的东西。您需要进行某种更重要的重新设计才能实现。
从根本上说,如果你想构建一个谓词,你不应该添加你不想在那里的表达式,而不是添加它们并试图稍后将它们拉回来。在您的情况下,这意味着,只要您想要过滤名称包含值的项目,就不会无条件地过滤掉已删除的项目。如果您的要求声明他们有时需要分开,请将这两项操作分开。