LINQ:拆分OR条件

时间:2014-04-15 20:22:29

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

所以我有以下条件

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

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

3 个答案:

答案 0 :(得分:4)

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

  1. 应用"其中"每次都是原始查询,然后是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表达式连接。 (除非你已经有了帮助你的库,否则很复杂:在加入主体后,你还必须遍历表达式树来替换参数表达式。它可能会变粘。

  3. 使用PredicateBuilder之类的工具为您做#2。

答案 1 :(得分:1)

.Where()假定为逻辑AND,据我所知,没有开箱即用的解决方案。如果您要分隔OR语句,可能需要查看使用Predicate BuilderDynamic Linq

答案 2 :(得分:0)

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

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