问题:返回所有记录where Jon Doe =<bus_contact> 或 <bus_sponsor>.
当前代码返回记录1,因此仅使用一个查询返回记录1和2需要进行哪些修改?
XML
<root>
<row>
<project_id>1</project_id>
<project_name>Name1</project_name>
<bus_contact>Jon Doe</bus_contact>
<bus_sponsor>Bruce Wayne</bus_sponsor>
</row>
<row>
<project_id>2</project_id>
<project_name>Name2</project_name>
<bus_contact>Peter Parker</bus_contact>
<bus_sponsor>Jon Doe</bus_sponsor>
</row>
</root>
Run Code Online (Sandbox Code Playgroud)
C#
class Program
{
static void Main (string[] args)
{
XElement main = XElement.Load ("master_list.xml");
var results = main.Descendants ("row")
.Descendants ("bus_contact")
.Where (e => e.Value == "Jon Doe")
.Select (e => e.Parent)
.Select (e => new {
project_id = e.Descendants ("project_id").FirstOrDefault ().Value,
project_name = e.Descendants ("project_name").FirstOrDefault ().Value
});
foreach (var result in results)
Console.WriteLine ("{0}, {1}", result.project_id, result.project_name);
Console.ReadLine ();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这与可能的重复链接中指出的问题不完全相同.是的,它部分地指的是这一点,但作为一个初学者得到一个适当的上下文的答案,接受的答案提供,是非常有帮助的.
用||结合Any,就像这样:
var results = main.Descendants("row")
.Where(r =>
r.Descendants("bus_contact").Any(c => c.Value == "Jon Doe")
|| r.Descendants("bus_sponsor").Any(c => c.Value == "Jon Doe")
);
Run Code Online (Sandbox Code Playgroud)
UsingAny允许您按条件查询子级,而无需实际下降到子级。这消除了通过选择爬回树的必要性Parent。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |