【问题标题】:LINQ: Split Where OR conditionsLINQ:拆分 Where OR 条件
【发布时间】:2014-05-30 09:34:42
【问题描述】:

所以我有以下 where 条件

sessions = sessions.Where(y => y.session.SESSION_DIVISION.Any(x => x.DIVISION.ToUpper().Contains(SearchContent)) ||
                                                   y.session.ROOM.ToUpper().Contains(SearchContent) ||
                                                   y.session.COURSE.ToUpper().Contains(SearchContent));

我想根据字符串是否为空将其拆分为多行,例如:

if (!String.IsNullOrEmpty(Division)) {
    sessions = sessions.Where(y => y.session.SESSION_DIVISION.Any(x => x.DIVISION.ToUpper().Contains(SearchContent)));
}

if (!String.IsNullOrEmpty(Room)) {

    // this shoudl be OR
    sessions = sessions.Where(y => y.session.ROOM.ToUpper().Contains(SearchContent));
}

if (!String.IsNullOrEmpty(course)) {

    // this shoudl be OR
    sessions = sessions.Where(y => y.session.COURSE.ToUpper().Contains(SearchContent));
}

如果您注意到我想添加多个 OR 条件,根据 Room、course 和 Division 字符串是否为空进行拆分。

【问题讨论】:

    标签: sql .net linq where-clause multiple-conditions


    【解决方案1】:

    有几种方法可以解决这个问题:

    1. 每次将“where”应用于原始查询,然后Union() 生成查询。

      var queries = new List<IQueryable<Session>>();
      if (!String.IsNullOrEmpty(Division)) {
          queries.Add(sessions.Where(y => y.session.SESSION_DIVISION.Any(x => x.DIVISION.ToUpper().Contains(SearchContent))));
      }
      
      if (!String.IsNullOrEmpty(Room)) {
      
          // this shoudl be OR
          queries.Add(sessions.Where(y => y.session.ROOM.ToUpper().Contains(SearchContent)));
      }
      
      if (!String.IsNullOrEmpty(course)) {
      
          // this shoudl be OR
          queries.Add(sessions.Where(y => y.session.COURSE.ToUpper().Contains(SearchContent)));
      }
      
      sessions = queries.Aggregate(sessions.Where(y => false), (q1, q2) => q1.Union(q2));
      
    2. 执行表达式操作以将 lambda 表达式的主体合并在一起,并由 OrElse 表达式连接。 (很复杂,除非您已经有库可以帮助您:加入主体后,您还必须遍历表达式树以替换参数表达式。它可能会变得粘滞。有关详细信息,请参阅this post

      李>
    3. 使用PredicateBuilder 之类的工具为您完成#2。

    【讨论】:

      【解决方案2】:

      .Where() 假定逻辑 AND 并且据我所知,没有现成的解决方案可以做到这一点。如果您想分隔 OR 语句,您可能需要考虑使用 Predicate BuilderDynamic Linq

      【讨论】:

        【解决方案3】:

        您可以创建一个扩展方法来有条件地应用过滤器:

        public static IQueryable<T> WhereIf<T>(
           this IQueryable<T> source, bool condition, 
           Expression<Func<T, bool>> predicate)
        {
            return condition ? source.Where(predicate) : source;
        }
        

        并像这样使用它:

        using static System.String;
        
        ...
        
        var res = sessions
           .WhereIf(!IsNullOrEmpty(Division), y => y.session.SESSION_DIVISION.ToUpper().Contains(SearchContent))
           .WhereIf(!IsNullOrEmpty(Room), y => y.session.ROOM.ToUpper().Contains(SearchContent))
           .WhereIf(!IsNullOrEmpty(course), y => y.session.COURSE.ToUpper().Contains(SearchContent)));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-02
          相关资源
          最近更新 更多