Linq Возврат отфильтрованных дочерних элементов

У меня есть момент, когда кажется, что это должно быть прямолинейно, но я не могу понять это правильно. У меня есть простая коллекция:

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

Я хочу, чтобы пользователь мог фильтровать на основе Category.Name, сохраняя при этом иерархию. Так например.

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

Если пользователь вводит C, фильтр должен вернуть

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

Моя попытка до сих пор была

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

Это отфильтрует и вернет мне все имена категорий, которые содержат элементы категории, соответствующие фильтру, но я все равно получаю весь список дочерних категорий без фильтрации. Что мне не хватает?


person billb    schedule 07.12.2009    source источник
comment
Я представлял дочерние записи. Это дерево, но глубиной всего один уровень.   -  person billb    schedule 07.12.2009
comment
Ой. Я думал, что ABC ---› 123 ---› CDE означает двухуровневое глубокое дерево.   -  person Alex Black    schedule 07.12.2009
comment
какой тип vm, vm.CategoryList и p.CategoryItems? Похоже, что q — это ваша категория, так что CategoryItems будет IEnumerable<Category>, но тогда что в ней содержится член CategoryItems этого типа?   -  person Eamon Nerbonne    schedule 07.12.2009


Ответы (1)


Вам нужно вызвать Select и вернуть отфильтрованный дочерний список, например:

var v = vm.CategoryList
          .Select(p => new { p.CategoryName, CategoryItems = p.CategoryItems.Where(q => q.Name.Contains(SearchText)))
          .Where(p => p.CategoryItems.Any()));
person SLaks    schedule 07.12.2009
comment
Я думаю, ему нужно решение, которое будет искать по N уровням иерархии, например. он должен быть рекурсивным - person Alex Black; 07.12.2009
comment
Некоторые синтаксические ошибки, но я понял суть, и это то, что я искал. Спасибо. Правильный синтаксис: var v = vm.CategoryList.Select(p => new { p.CategoryName, Items = p.CategoryItems.Where(q => q.Name.Contains(SearchText)).Where(a => a. ИмяКатегории.Любой()) } ) - person billb; 07.12.2009
comment
Вы хотите написать .Where(a => a.CategoryItems.Any()) (не Name) - person SLaks; 07.12.2009