LINQ: Split Where OR conditions

后端 未结 3 654
盖世英雄少女心
盖世英雄少女心 2021-01-18 23:35

So I have the following where conditions

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


        
3条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-19 00:04

    There are a few ways to go about this:

    1. Apply the "where" to the original query each time, and then Union() the resulting queries.

      var queries = new List>();
      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. Do Expression manipulation to merge the bodies of your lambda expressions together, joined by OrElse expressions. (Complicated unless you've already got libraries to help you: after joining the bodies, you also have to traverse the expression tree to replace the parameter expressions. It can get sticky. See this post for details.

    3. Use a tool like PredicateBuilder to do #2 for you.

提交回复
热议问题