5

所以我有以下 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));
}

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

4

3 回答 3

4

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

  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表达式连接。(很复杂,除非您已经有库可以帮助您:加入主体后,您还必须遍历表达式树以替换参数表达式。它可能会变得粘滞。有关详细信息,请参阅此帖子

  3. 使用PredicateBuilder之类的工具为您执行 #2。
于 2014-04-15T20:27:58.193 回答
1

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

于 2014-04-15T20:28:14.237 回答
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)));
于 2019-06-17T21:34:58.603 回答