【问题标题】:Using Linq to query nested dynamic objects使用 Linq 查询嵌套的动态对象
【发布时间】:2015-09-10 20:48:23
【问题描述】:

我已使用以下 linq 查询来访问成员名称。以下成功返回集合中的所有成员 Name 值。

var we = CsQ.Groups.SelectMany(g => g.Members).Where(a => a.Name == "Name").Select(b => b.Value).ToList();

我现在想根据“成员”中名为 AbsoluteUri 的另一个属性来过滤此属性,该属性嵌套在属性 AgentsByUri 中。这不起作用,但给出了结构的概念:

var uri = CsQ.Groups.SelectMany(g => g.Members).Where(a => a.Name == "AgentsByUri").Select(b => b.Value).//??? I NEED TO NOW ACCESS "AbsoluteUri"

如何将这些组合到一个查询中,以便仅返回具有包含“SomeValue”的“AbsoluteUri”的“Names”。 AbsoluteUri 似乎嵌套在一个集合中,该集合嵌套在 AgentsByUri 中,这增加了复杂性。

您可以在此处查看 AgentsByUri 对象的结构 - Using C# Linq to query nested objects

请原谅我的术语,我对 C# 相当陌生!希望这是有道理的:)

非常感谢任何帮助或指导:)

EDIT3 到达某个地方!转换为动态部分工作 - member.AgentsByUri 现在可以了,只是无法弄清楚如何使其适用于查询的其余部分。尝试在不同的位置添加,但没有成功。

EDIT2 感谢大家的意见。我没有取得任何进一步的成功。我认为最大的问题是我正在处理一个在运行时动态生成的 PowerShell 对象。结果我无法访问类/对象,因为编译器还没有关于它们。为了解决这个问题,我使用“动态”类型,它允许编译器相信我提供的内容在运行时是有效的。我可以在 linq 查询中转换为动态吗?还是我需要以不同的方式解决这个问题?

以下是我从示例中得到的:

EDIT1(点击放大,图片为高分辨率):

【问题讨论】:

  • 你能澄清一下类的结构吗?链接答案上的图片小而模糊
  • Linq 不进行递归。创建一个递归函数并将 Linq 放入递归函数中。
  • 只需在您的问题中包含课程。作为代码,而不是图像。没有人喜欢根据不完整的信息给出答案。
  • 感谢大家的cmets,非常感谢。你们中的一些人希望对我正在处理的数据有所了解。我已经用一张应该显示给你的图片更新了帖子。
  • 对不起,这真的行不通。你为什么不在命名类型的结构中捕获动态类型,如果只是为了在这里展示呢?

标签: c# linq


【解决方案1】:

我只是根据您提供的图片写下来。但是,如果没有周围的代码,我无法检查正确性,因此无法保证。

var uri = CsQ.Groups
    .SelectMany(g => g.Members)
    .Where(m => m.AgentsByUri.SelectMany(a => a.Value, (a, v) => v.AbsoluteUri).Contains("SomeValue"))
    .Select(b => b.Value)

在 LINQ 语法中应该更清晰

var uri =
    from group in CsQ.Groups
    from dynamic member in group.Members
    where
        (from agent in (IEnumerable<dynamic>)member.AgentsByUri
         where agent.Name = "AgentsByUri"  // this line may be redundant
         from x in (IEnumerable<dynamic>)agent.Value
         select x.AbsoluteUri).Contains("SomeValue")
    select member.Value;

编辑:我第二条评论中的建议不太奏效。我更改了上面 LINQ 语法中的代码,通过显式转换为 IEnumerable&lt;dynamic&gt;,将动态对象作为源。但是请注意,对于值类型的枚举,强制转换将失败。 我希望这对你有用。

【讨论】:

  • 试试.Cast&lt;dynamic&gt;()
  • 带着这个去某个地方!见 EDIT3
  • 这看起来很有趣,我只是不太了解它:) - c-sharpcorner.com/UploadFile/FreeBookArticles/AddisonWesley/…
  • 您必须将它应用于每个动态对象,大概是成员、代理和 x。顺便提一句。明确指定类型为动态。例如from dynamic member in g.Members相当于from member in g.Members.Cast&lt;dynamic&gt;()
【解决方案2】:

如果没有对类结构的正确概述,很难给出正确的答案。我想这可能有效:

var uri = CsQ.Groups.SelectMany(g => g.Members).Where(a => a.Name == "AgentsByUri").Select(b => b.Value).Where(x => x.AbsoluteUri == "SomeValue");

【讨论】:

    【解决方案3】:

    我不得不在这里进行一些挖掘并做出一些假设:

    1. 您想要返回 PSMemberInfo 列表。
    2. PsMemberInfo.Name 必须等于“AgentsByUri”。
    3. 在 Value 属性(它是 Uri 的集合)中,您希望在 AbsoluteUri 属性等于“SomeValue”的项目上过滤此集合。
    var we = CsQ.Groups.SelectMany(g => g.Members).Where(member => member.Name == "AgentsByUri" && member.Value != null && member.Value.Any(uri => uri.AbsoluteUri == "SomeValue")).ToList();
    

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多