Привязка к объектам Список в списке - PullRequest
5 голосов
/ 30 ноября 2010

У меня есть список фильмов

List<Movie> MovieList

, и у меня есть список выбранных категорий

List<string> SelCat

И, скажем, я хочу выбрать из списка фильмов, где он соответствует 2 категориямкак в приведенном ниже SQL-выражении:

SELECT * FROM MovieList WHERE MovieList.Category = 'Action' AND MovieList.Category = 'Drama'

Я могу немного приблизиться к linq следующим образом:

var q = (from b in MovieList where b.Categories.Any(p=> SelCat.Contains(p)) select b);

Но это действуеткак запрос OR, а не AND.Я хочу, чтобы он выбрал все фильмы, которые имеют категорию боевика и драмы.

Кстати: Movie.Categories - это список строк Movie.Categories должен содержать элементы в SelCat .

Как мне добиться этого с помощью Linq to Objects?

Ответы [ 7 ]

9 голосов
/ 30 ноября 2010
var q = from m in MovieList where SelCat.All(c => m.Categories.Contains(c))

Совершенно близко к тому, что вы бы сказали, описывая проблему на английском языке:

Выберите фильмы, в которых категории фильмов содержат все категории в SelCat.

1 голос
/ 30 ноября 2010
   var SelectedCategories = List<string>();//list of selected categories

from movie in MovieList
join selCat in Categories.Where(SelectedCategories.Contains(selCat.Category)
on movie.category equals selCat.category
select movie
1 голос
/ 30 ноября 2010

Если вы хотите, чтобы фильм соответствовал всем интересным категориям (т.е. все категории в SelCat присутствуют в movie.Categories), вы можете сделать:

MovieList.Where(movie => !SelCat.Except(movie.Categories).Any()); 

С другой стороны, если вы хотите, чтобы фильм соответствовал как минимум 2 из выбранных категорий:

MovieList.Where(movie => SelCat.Intersect(movie.Categories).Count() >= 2); 
0 голосов
/ 30 ноября 2010

попробуйте

var matches = MovieList.Where(m => SelCat.Except(
    m.Categories.Intersect(SelCat)).Count() == 0);
0 голосов
/ 30 ноября 2010
var result = from movie in movieList
             where selCat.All(selectedCategory => movie.Categories.Contains(selectedCategory))
             select movie;

запомните разницу между .All() и .Any()

0 голосов
/ 30 ноября 2010

Немного запутанный:

var moviesInSelCat = MovieList.Where(m => SelCat.All(sc => m.Category.Any(c => c == sc)));
0 голосов
/ 30 ноября 2010

просто сделайте пересечение с последующим исключением.это работает, извините, мне пришлось написать это в VB.

Dim categories As New List(Of String)
Dim selected As New List(Of String)

        categories.Add("ali")
        categories.Add("ali2")
        categories.Add("ali3")
        categories.Add("ali4")

        selected.Add("ali2")
        selected.Add("ali4")


        Dim common = categories.Intersect(selected)

        If common.Except(selected).Count = 0 Then
            'true
        Else
            'false
        End If
...