我会以我正在积极寻找这个问题的解决方案作为序言,但我认为如果堆栈中的某个人已经解决了这个问题,我可能会缩短一些研发时间。(我在网上没有找到任何东西,所以这里是)
在我们正在构建的应用程序框架中有一个案例,我们需要能够接收一组谓词 ( List<Expression<Func<T,bool>>>
) 并在搜索框架中对其进行解析。
现在我们有能力以这种方式过滤:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess is a custom extension method that restricts the dataset
// to access restrictions.
var query = _dbContext.Set<EntityType>()
.FilterToUserAccess(user);
foreach(var p in predicates){
query = query.Where(p);
}
return p.ToList();
我们需要这样做的原因是为了可过滤对象的可扩展性。但是,鉴于 EF 的内置功能,这不可能进行快速搜索。我需要能够做的是:
对象 A(假设它是一辆赛车),我们想在快速搜索框中搜索品牌、型号、车队和车手。因此,如果我输入“Earnhardt”,它将搜索所有赛车实体属性,即品牌、型号、车队和车手。我最终会得到所有的 DEI 汽车以及 Dale Jr。我想使用相同的方法,以便我们可以配置一个可搜索的实体并在应用程序启动时反映搜索配置。理想情况下,我希望通过某种方式使查询看起来类似于:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess is a custom extension method that restricts the dataset
// to access restrictions.
var query = _dbContext.Set<EntityType>()
.FilterToUserAccess(user);
foreach(var p in predicates){
query = query.Or(p);
}
return p.ToList();
我意识到我可以做到:
_dbContext.Set<EntityType>().Where(predicate1 || predicate2 || predicate3)
但是,这不适用于我们要解决此问题的方法。理想情况下,我们的一个客户站点的管理员可以通过单击进入并配置一个额外的搜索词,以包含在对该实体类型的任何和所有快速搜索中,就像我们目前可以使用使用标准的过滤器一样.Where(...)
“和”链接逻辑。