关于c#:查询List项的多个属性

Querying multiple properties of List items

我有一个列表类型:

1
2
3
4
5
6
7
List<Concept>
  --- Property
  --- List<Class2>
  --- --- Class2pty
  --- --- Class2pty2
  --- List<Class3>
  --- --- Class3pty

有了一个querystring,我需要一个新的概念列表,在任何属性(好的,一种属性)上都有这个querystring,比如property或class2pty2、class3pty…

使用where,我可以查询属性,但我不知道如何查询class2pty,如果匹配,则返回具有该class2的概念

那么,我可以用一个嵌套查询来实现这一点吗,或者我可以做什么呢?

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

假设我有一个"foo"的查询字符串,并且我有一个包含这4项的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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"

第一个列表项在属性上有foo,第二个列表项(假设列表有10个class2实例,其中一个(或更多))在class2pty上有foo,第三个列表项在任何属性上没有foo(在概念实例本身和内部实例中),四个列表项有foo。

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

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


如果我正确理解您的问题,您希望选择与条件匹配的外部类,并包含与条件匹配的内部类?

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

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

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

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