Linq回归过滤的孩子

bil*_*llb 1 c# linq collections filter

我有一个"呃"的时刻,这似乎应该是直截了当的,但我似乎无法做到正确.我有一个简单的集合:

Category Name
   ---> List<Category>  (Children of this category)
Run Code Online (Sandbox Code Playgroud)

我希望用户能够在维护层次结构的同时基于Category.Name进行过滤.所以举个例子.

My Category
  ---> Category.Name, "ABC"
  ---> Category.Name, "123"
  ---> Category.Name, "CDE"
Run Code Online (Sandbox Code Playgroud)

如果用户键入C,则应返回过滤器

My Category
  ---> Category.Name, "ABC"
  ---> Category.Name, "CDE"
Run Code Online (Sandbox Code Playgroud)

到目前为止我的尝试一直是

var v = vm.CategoryList
        .Where(p => p.CategoryItems.Any(q => q.Name.Contains(SearchText)));
Run Code Online (Sandbox Code Playgroud)

这将过滤并返回包含与过滤器匹配的类别项的所有类别名称,但我仍然获得未过滤的整个子类别列表.我错过了什么?

SLa*_*aks 6

您需要调用Select并返回已过滤的子列表,如下所示:

var v = vm.CategoryList
          .Select(p => new { p.CategoryName, CategoryItems = p.CategoryItems.Where(q => q.Name.Contains(SearchText)))
          .Where(p => p.CategoryItems.Any()));
Run Code Online (Sandbox Code Playgroud)