2009-12-07 45 views
1

我有一个'杜'时刻,这似乎应该是直线前进,但我似乎无法做到正确。我有一个简单的集合: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))); 

这将会过滤,并给我回包含类别的所有类别名称与过滤器匹配的项目,但我仍然可以看到整个儿童分类列表,未经过滤。我错过了什么?

+1

是什么 “--->” 是什么意思? – 2009-12-07 14:12:28

+0

我代表的是儿童记录。这是一棵树,但只有一层。 – billb 2009-12-07 14:28:21

+0

哦。我认为“ABC”--->“123”--->“CDE”意思是一个两级深的树。 – 2009-12-07 14:29:14

回答

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())); 
+0

我认为他需要一个解决方案来搜索N层次的层级,例如它必须是递归的 – 2009-12-07 14:19:11

+0

一些语法错误,但我得到了要点,这就是我一直在寻找的。谢谢。正确的语法是:var v = vm.CategoryList.Select(p => new {p.CategoryName,Items = p.CategoryItems.Where(q => q.Name.Contains(SearchText))。where(a => a。 CategoryName.Any())}) – billb 2009-12-07 14:49:44

+0

你想编写'.Where(a => a.CategoryItems.Any())'(不是'Name') – SLaks 2009-12-07 15:14:51