使用Linq查询嵌套的动态对象

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

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

我现在想要根据名为AbsoluteUri的“Members”中的另一个属性对其进行过滤,该属性嵌套在属性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”的“名称”。 AbsoluteUri似乎嵌套在一个嵌套在AgentsByUri中的集合中,这个集合会增加复杂性。

您可以在此处查看AgentsByUri对象的结构 – 使用C#Linq查询嵌套对象

请原谅我的术语,我是C#的新手! 希望这是有道理的:)

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

EDIT3到达某个地方! 转换为动态部分工作 – member.AgentsByUri现在正常,只是无法弄清楚如何使其应用于查询的其余部分。 尝试在各个地方添加没有运气。

像动态一样

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

以下是我得到的例子:

尝试访问动态对象时编译器错误

EDIT1 (点击和缩放,图片为高分辨率): 数据结构

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

 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)member.AgentsByUri where agent.Name = "AgentsByUri" // this line may be redundant from x in (IEnumerable)agent.Value select x.AbsoluteUri).Contains("SomeValue") select member.Value; 

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

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

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

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

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