2010-11-30 12 views
4

J'ai une liste des filmsLinq à des objets Liste dans la liste

List<Movie> MovieList 

et j'ai une liste des catégories sélectionnées

List<string> SelCat 

Et dire que je veux choisir dans la liste de films où il correspond 2 catégories, comme l'instruction SQL ci-dessous:

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

je peux obtenir un peu c perdre avec LINQ comme ceci:

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

Mais il agit comme une requête OU, ET pas. Je veux qu'il sélectionne tous les films qui ont une catégorie d'action et de drame.

BTW: Movie.Categories est une Liste de chaîne. ET Movie.Categories doit contenir des éléments dans SelCat. Comment réaliser ceci avec Linq to Objects?

+0

MovieList.Category = 'Action' ET MovieList.Category = 'Drama', voulez-vous dire pas MovieList.Category = 'Action' OR MovieList.Category = 'Drama' – hazimdikenli

+0

Non, MovieList.Categories est une liste

+0

Vous voulez trouver tous les films qui sont ACTION et DRAMA? Donc, un film qui n'a que DRAMA dans ses catégories n'est pas celui que vous voulez? –

Répondre

9
var q = from m in MovieList where SelCat.All(c => m.Categories.Contains(c)) 

Tout près de ce que vous diriez décrivant le problème en anglais:

films sélectionnés pour lesquels les catégories de films contiennent toutes les catégories SelCat .

+0

C'était tout! Je vous remercie. –

0

juste faire un croisement suivi par sauf. cela fonctionne, je suis désolé je devais l'écrire en 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 
+0

Malheureusement, pas la bonne réponse. Je ne sais pas si ce sera l'action ou le drame ou la comédie, mais les Movie.Categories doivent contenir des éléments dans le SelCat. –

+0

oh maintenant j'ai compris ce que vous voulez dire, laissez-moi le réparer ... –

0

Un peu alambiquée:

var moviesInSelCat = MovieList.Where(m => SelCat.All(sc => m.Category.Any(c => c == sc))); 
0
var result = from movie in movieList 
      where selCat.All(selectedCategory => movie.Categories.Contains(selectedCategory)) 
      select movie; 

rappeler la différence entre .All() et .Any()

+1

Ceci sélectionnera les films dont les catégories sont un sous-ensemble des catégories sélectionnées. L'OP veut réaliser l'effet inverse. – Jon

+0

merci ... mélangé cela :) –

+0

Merci, mais je reçois 0 enregistrements de cette requête. –

1

Si vous voulez que le film correspond tous des catégories intéressantes (par exemple toutes les catégories dans SelCat sont présents dans movie.Categories), vous pouvez le faire:

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

d'autre part, si vous voulez que le film correspond atleast 2 du sel Catégories échies:

MovieList.Where(movie => SelCat.Intersect(movie.Categories).Count() >= 2); 
+0

Fermer, mais je n'ai que 132 enregistrements alors que j'aurais dû en avoir 183. Merci d'avoir essayé! –

+3

+1 l'OP donne un mauvais exemple. "Action" et "Drama" ont rendu les autres codes durs, mais ils sont essentiellement des éléments du 'SelCat'. –

+0

@Rick Ratayczak: Si vous pouvez décrire * pourquoi * ce n'est pas ce que vous voulez, ce serait utile. – Ani

0

essayer cette

var matches = MovieList.Where(m => SelCat.Except(
    m.Categories.Intersect(SelCat)).Count() == 0); 
+0

Ceci est proche également, mais ne renvoie que 132 enregistrements quand je sais qu'il y a 183. Merci! –

0
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 
Questions connexes