【问题标题】:Building expressions in c# with LinqKit使用 LinqKit 在 c# 中构建表达式
【发布时间】:2017-08-09 05:17:09
【问题描述】:

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

【问题讨论】:

    标签: c# linq lambda linqkit


    【解决方案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);
    

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

    【讨论】:

      【解决方案2】:

      您可以将 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);
      

      【讨论】:

      • 如果添加更多属性会变得复杂吗?
      • @Robert - 我们只是添加了一个空检查。我不认为它更复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2018-12-18
      • 2015-11-29
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多