【问题标题】:Querying multiple properties of List items查询List项的多个属性
【发布时间】:2012-12-03 22:08:01
【问题描述】:

我有一个列表类型:

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

有一个查询字符串,我需要一个新的 Concepts 列表,该列表在任何属性(嗯,一种属性)上都有该查询字符串,例如 Property Class2pty2Class3pty...

使用 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 有 10 个 Class2 实例和一个其中(或者更多))在 Class2Pty 上有 foo,第三项在任何属性上都没有 foo(在 Concept 实例中)本身和内部实例),四个项目确实有它。

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

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

【问题讨论】:

  • 我认为在.Where() 之后你可以简单地做一个.ToList() 然后继续方法链接。
  • 我不确定。如果 Where with Property 返回 none(未找到匹配项),则结果列表将为空,因此我无法链接。
  • 这看起来像一个已知深度的树遍历。所以我不确定你是否可以在单个查询中完成。
  • 你知道你查询的是什么属性吗?有什么限制。如果你知道你将要测试什么,你可以做什么...list.Where(i =&gt; i.Property == "something" &amp;&amp; (i.Class2.Where(x =&gt; x.Class2pty == "").ToList().Count &gt; 0));
  • 这是一个已知深度的列表,不需要单个查询。你说的 Jared,是我首先尝试的,但这不起作用,你在做一个 bool && IEnumerable.

标签: c# linq search


【解决方案1】:

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

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

如果概念没有匹配的属性,它就会被淘汰。如果它们包含与预期条件匹配的类,则将返回与该属性匹配的概念。 (在我的示例中,包含一个值 > 1 的属性,可以是任何条件。)

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

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

【讨论】:

  • 第一个例子不应该涵盖它吗? concepts.Where(c=&gt; c.Property == queryString || c.Class2s.Any(c2=&gt;c2.Class2Pty == queryString) || c.Class3s.Any(c3=&gt;c3.Class3Pty == queryString)); 显然,对于真正的类结构,这可能很快就会变得笨拙。 IMO 的主要重点应该放在更具可读性的内容上。
  • Yeeeeeep 确实,Where 与 || 的组合但这次使用 Any(和 Exists,因为我有更多的 annidation)成功了。
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多