1

仍在学习 Linq 并且在尝试在同一选择中检索和元素以及另一个元素的后代时遇到问题。我搜索了一个解决方案,但找不到我正在寻找的东西并想出了一个解决方案。但这是正确的方法吗?不知何故,虽然它有效,但感觉确实不错。

我有以下 XML 结构:

<Tables>
    <Table>
        <SourceTable>WrittenRecordsTable</SourceTable>
        <Researcher>Fred Blogs</Researcher>
        <QuickRef>cwr</QuickRef>
        <TableType>WrittenRecords</TableType>
        <FieldMapping>
            <RecordID>ID</RecordID>
            <StartYear>StartYear</StartYear>
            <EndYear>EndYear</EndYear>
            <LastName>LastName</LastName>
            <Title>Title</Title>
            <Subject>Subject</Subject>
            <Description>Reference</Description>
        </FieldMapping>
    </Table>
</Tables>

以及以下 Linq to XML:

var nodes = (from n in xml.Descendants("FieldMapping")
            select new
            {
                SourceTable = (string)n.Parent.Element("SourceTable").Value,
                RecordID = (string)n.Element("RecordID").Value,
                StartYear = (string)n.Element("StartYear").Value,
                EndYear = (string)n.Element("EndYear").Value,
                LastName = (string)n.Element("LastName").Value,
                Title = (string)n.Element("Title").Value,
                Subject = (string)n.Element("Subject").Value
             }).ToList();

这是我检索SourceTable元素的方式感觉不对。是我担心太多还是有更好的方法?另外,使用 c# 表达式而不是查询更好吗?

4

1 回答 1

1

如果您的文档结构始终必须包含这些节点,那么您的查询(和访问SourceTable)就可以了。鉴于读者知道 XML 的样子,发生的事情是相当明显的。

但是,如果您想要更多自上而下的方法(这可能看起来更自然且更容易掌握),您始终可以Table先查询节点并将其存储FieldMapping在变量中,但我不会说它比您的方法有任何优势:

var nodes = (from table in doc.Descendants("Table")
             let fieldMapping = table.Element("FieldMapping")
             select new
             {
                 SourceTable = (string)table.Element("SourceTable").Value,
                 RecordID = (string)fieldMapping.Element("RecordID").Value,
                 StartYear = (string)fieldMapping.Element("StartYear").Value,
                 EndYear = (string)fieldMapping.Element("EndYear").Value,
                 LastName = (string)fieldMapping.Element("LastName").Value,
                 Title = (string)fieldMapping.Element("Title").Value,
                 Subject = (string)fieldMapping.Element("Subject").Value
             }).ToList();
于 2013-07-07T23:22:40.767 回答