使用LinqKit

时间:2017-03-17 15:12:53

标签: c# linq lambda linqkit

如果提供了查询参数,有没有办法忽略初始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,那么它将永远不会返回任何数据。

2 个答案:

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