LINQ - 可选/可空的条件

时间:2014-05-07 08:12:44

标签: linq entity-framework where-clause

我确实有以下LINQ查询,从我的数据库中选择包含给定搜索字符串的电影,或者我有一个或多个我给该函数的标记。

问题是,如果搜索字符串或tags参数为空/ null,我就没有电影。然而,所需的操作是获取所有电影,因此,如果一个参数为空或空,我不想应用它。

我该怎么做?

public IEnumerable<Group<Genre, Movie>> GetMoviesGrouped(string search, List<Tag> tags)
{
    var movies = from movie in Movies
    where ( movie.Name.Contains(search)) && movie.Tags.Any(mt => tags.Any(t => t.ID == mt.ID))  
    group movie by movie.genre into g
    select new Group<Genre, Movie> { Key = g.Key, Values = g };
....
}

2 个答案:

答案 0 :(得分:3)

为了便于阅读,我喜欢一步一步地做到这一点

var movies = Movies;

if (!string.IsNullOrEmpty(search))
  movies = movies.Where(m => m.Name.Contains(search));

if (tags != null && tags.Any()) {
  var tagIds = tags.Select(m => m.ID);
  movies = movies.Where(m => m.Tags.Any(x => tagIds.Contains(x.ID));
}

var result = from movie in movies
             group ...

答案 1 :(得分:2)

如果没有提供任何内容,您可以执行此类操作以跳过检查:

where (string.IsNullOrEmpty(search) || movie.Name.Contains(search)) &&
      (!tags.Any() || movie.Tags.Any(mt => tags.Any(t => t.ID == mt.ID)))