如果提供了查询参数,有没有办法忽略初始true
表达式
var query = ctx.Articles
.AsNoTracking()
.WithSmallIncludes();
Expression<Func<DbContext.Article, bool>> searchCondition = m => true;
if (!string.IsNullOrWhiteSpace(request.Title))
searchCondition = searchCondition.Or(m => m.Title.Contains(request.Title));
if (!string.IsNullOrWhiteSpace(request.Summary))
searchCondition = searchCondition.Or(m => m.Summary.Contains(request.Summary));
query = query.AsExpandable().Where(searchCondition);
现在它总是会返回所有内容,因为表达式等于真或某事或某事。
如果我将初始表达式更改为false,那么它将永远不会返回任何数据。
答案 0 :(得分:1)
如果我将初始表达式更改为false,那么它将永远不会返回任何数据。
如果没有符合您的搜索条件,或者没有提供搜索条件,则应该是这种情况。如果没有符合标准,那么这在技术上是正确的行为(或者其他地方有错误/错误数据)。因此,如果不提供搜索,您需要关注的是不应用条件。例如:
var query = ctx.Articles
.AsNoTracking()
.WithSmallIncludes();
if(string.IsNullOrWhiteSpace(request.Title) && string.IsNullOrWhiteSpace(request.Summary))
return query;
Expression<Func<DbContext.Article, bool>> searchCondition = m => false;
if (!string.IsNullOrWhiteSpace(request.Title))
searchCondition = searchCondition.Or(m => m.Title.Contains(request.Title));
if (!string.IsNullOrWhiteSpace(request.Summary))
searchCondition = searchCondition.Or(m => m.Summary.Contains(request.Summary));
query = query.AsExpandable().Where(searchCondition);
我个人可能会专注于创建一个标准列表,并在最后检查是否有任何标准,并且如果有一些标准,则只将它们聚合成表达式。如果您最终在未来添加更多可搜索的组件,那么这将更不容易出错。
答案 1 :(得分:1)
您可以将searchCondition
设置为null并跳过第一个Or
表达式。
Expression<Func<DbContext.Article, bool>> searchCondition = null;
Expression<Func<DbContext.Article, bool>> filterCondition = null;
if (!string.IsNullOrWhiteSpace(request.Title))
{
searchCondition = m => m.Title.Contains(request.Title);
}
if (!string.IsNullOrWhiteSpace(request.Summary))
{
filterCondition = m => m.Summary.Contains(request.Summary);
if(searchCondition == null)
searchCondition = filterCondition;
else
searchCondition = searchCondition.Or(filterCondition);
}
if(searchCondition != null)
query = query.AsExpandable().Where(searchCondition);