Pregunta

I do have the following LINQ query, selecting movies from my database that either contain the given search string or have one or more of the tags that I give to the function.

The problem is, that if the search string or the tags parameter are empty/null, I get no movies. The desired action however, is to get all the movies, so, if one parameter is null or empty, I don't want to apply it.

How can I do that?

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 };
....
}
¿Fue útil?

Solución 2

You can do something like this to skip the check if nothing is provided:

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

Otros consejos

Just for readability, I like to do it step by step

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 ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top