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

时间:2015-09-10 20:48:24

标签: c# 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对象的结构 - Using C# Linq to query nested objects

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

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

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

Cast as dynamic

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

继续我得到的例子给出了:

Compiler error when trying to access dynamic object

EDIT1 (点击和缩放,图片为高分辨率): Data Structures

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;

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