查询List项的多个属性

时间:2012-12-03 22:08:01

标签: c# linq search

我有一个List类:

List<Concept>
  --- Property
  --- List<Class2>
  --- --- Class2pty
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty

有一个查询字符串,我需要一个新的概念列表,它在任何属性上都有查询字符串(好吧,一种属性),比如 Property Class2pty2 Class3pty ...

使用 Where 我可以查询 Property ,但我不知道如何查询 Class2pty ,如果匹配,则返回具有 Class2

的概念

那么,我可以使用单个嵌套查询执行此操作,还是可以执行哪些操作?

编辑:由于我不清楚,我举了一个例子

想象一下,我有一个“foo”的查询字符串,我有一个包含这4项的列表

Concept
  --- Property = "foo"
  --- List<Class2>
  --- --- Class2pty
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty

Concept
  --- Property
  --- List<Class2>
  --- --- Class2pty = "foo"
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty

Concept
  --- Property
  --- List<Class2>
  --- --- Class2pty = "bar"
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty

Concept
  --- Property
  --- List<Class2>
  --- --- Class2pty
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty = "foo"

第一个列表项在 Property 上有 foo ,在第二个项目上(想象List&lt; Class2&gt;有10个 Class2 的实例和其中一个(或者更多))在 Class2Pty 上有 foo ,第三个项目在任何属性上都没有 foo (在Concept中)实例本身和内部实例),有四个项目确实有它。

因此,当任何Concept项(包括其子项)具有包含 foo 项的属性时,请返回Concept项。在我们的例子中,1,2和4。

简而言之,拥有一个包含内部列表的概念列表,返回具有该字符串属性的每个Concept,或者如果其中一个子实例拥有它。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你想选择与条件匹配的外类,并包含一个匹配条件的内部类?

testConcepts.Where( c => c.Property == "SomeValue" 
                         && c.Classes.Any(cls => cls.Class2Pty > 1) );

如果Concept没有匹配属性,则将其删除。如果包含与预期条件匹配的类,则将返回与该属性匹配的概念。 (在我的示例中,包含值> 1的属性,可以是任何条件。)

要返回与其属性匹配的容器匹配的子类,可以使用.SelectMany()

testClasses = testConcepts.Where( c => c.Property == "SomeValue")
                       .SelectMany( c => c.Classes ).Where( cls => cls.Class2Pty > 1 );