2009-12-07 6 views
1

Je vais avoir un moment de "duh" où cela semble devoir être direct, mais je n'arrive pas à le faire correctement. J'ai une collection simple:Linq Retour Enfants Filtrés

Category Name 
    ---> List<Category> (Children of this category) 

Je veux que l'utilisateur peut filtrer en fonction Category.Name tout en maintenant la hiérarchie. Donc par exemple.

My Category 
    ---> Category.Name, "ABC" 
    ---> Category.Name, "123" 
    ---> Category.Name, "CDE" 

Si les types d'utilisateur C, le filtre doit retourner

My Category 
    ---> Category.Name, "ABC" 
    ---> Category.Name, "CDE" 

Ma tentative jusqu'ici a été

var v = vm.CategoryList 
     .Where(p => p.CategoryItems.Any(q => q.Name.Contains(SearchText))); 

Ce filtrera et me rendre tous les noms des catégories qui contiennent la catégorie les éléments qui correspondent au filtre, mais je reçois toujours la liste entière des catégories enfant, non filtrée. Qu'est-ce que je rate?

+1

Que signifie "--->" ça veut dire? –

+0

Je représentais des dossiers d'enfants. C'est un arbre, mais c'est seulement un niveau profond. – billb

+0

Oh. Je pensais que "ABC" ---> "123" ---> "CDE" signifiait un arbre profond à deux niveaux. –

Répondre

6

Vous devez appeler Select et retourner une liste d'enfants filtrée, comme ceci:

var v = vm.CategoryList 
      .Select(p => new { p.CategoryName, CategoryItems = p.CategoryItems.Where(q => q.Name.Contains(SearchText))) 
      .Where(p => p.CategoryItems.Any())); 
+0

Je pense qu'il a besoin d'une solution qui va chercher dans la hiérarchie N niveaux, par exemple. il doit être récursif –

+0

Quelques erreurs de syntaxe, mais j'ai eu l'essentiel et c'est ce que je cherchais. Je vous remercie. La syntaxe correcte est la suivante: var v = vm.CategoryList.Select (p => new {p.CategoryName, Items = p.CategoryItems.Where (q => q.Name.Contains (SearchText)). Où (a => a. CategoryName.Any())}) – billb

+0

Vous voulez écrire '.Where (a => a.CategoryItems.Any())' (pas 'Name') – SLaks

Questions connexes