0

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);

现在它总是返回一切,因为表达式等于 true OR something OR Something。

如果我将初始表达式更改为 false,那么它将永远不会返回任何数据。

4

2 回答 2

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);

我个人可能会专注于创建一个标准列表,并在最后检查是否有任何标准,如果有的话,只将它们聚合成一个表达式。如果您将来最终添加更多可搜索的组件,那将不太容易出错。

于 2017-03-17T15:20:30.777 回答
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);
于 2017-03-17T15:23:57.517 回答