2014-05-07 27 views
1

我確實有以下LINQ查詢,從我的數據庫中選擇包含給定搜索字符串的電影或者有一個或多個我給該函數的標記。LINQ - 可選/無空條件

問題是,如果搜索字符串或標籤參數是空/空,我沒有電影。但是,所需的操作是獲取所有電影,因此,如果一個參數爲空或空,我不想應用它。

我該怎麼做?

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

你可以做這樣的事情時跳過檢查如果提供什麼:

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

非常感謝,太棒了! – user66875

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 ... 
+0

非常感謝,很高興知道! – user66875