LINQ:拆分“或”条件

Eri*_*man 5 .net sql 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));
Run Code Online (Sandbox Code Playgroud)

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

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));
}
Run Code Online (Sandbox Code Playgroud)

如果您发现我想添加多个OR条件,则根据Room,course和Division字符串是否为空来拆分。

Str*_*ior 5

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

  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));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行表达式操作,将 lambda 表达式的主体合并在一起,并通过OrElse表达式连接。(除非你已经有库来帮助你,否则很复杂:加入主体后,你还必须遍历表达式树来替换参数表达式。它可能会变得粘滞。有关详细信息,请参阅这篇文章。

  3. 使用像PredicateBuilder这样的工具来为你做#2。