我使用以下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现在可以,只是无法弄清楚如何使其应用于查询的其余部分。尝试在各个地方加入,但没有运气。
EDIT2 感谢大家的投入。我没有取得任何进一步的成功。我认为最大的问题是我正在处理在运行时动态生成的PowerShell对象。因此,我无法访问类/对象,因为编译器还没有关于它们。为了解决这个问题,我使用了“动态”类型,它允许编译器相信我提供的内容在运行时是有效的。我可以在linq查询中强制转换为动态吗?或者我需要以不同的方式解决这个问题吗?
继续我得到的例子给出了:
答案 0 :(得分:1)
我不得不在这里做一些挖掘并做出一些假设:
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语法中的代码,以将动态对象作为源代码。但请注意,对于值类型的枚举,强制转换将失败。
我希望这对你有用。