1

我想获取基于后代的交易列表。但我无法正确获取 linq 语法。我的数据如下所示:

<Data>
    <MyTransactionXML>
           <contract>
                <contractID>1234</contractID>
                <ProductCode>ABC</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
    <MyTransactionXML>
            <contract>
                <contractID>13334</contractID>
                <ProductCode>DEF</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
</Data>

我在想这样的事情,但没有奏效:

xdoc.Root.Descendants("MyTransactionXML")
         .Where(y => y.Descendants("ProductCode")
                      .Where(z => z.Value == "NY.E.ENG.JE.SVC.RF.VAR2.UP") == true);

我不想硬编码它是 MyTransactionXML.contract.ProductCode,因为如果位置发生变化或者我们使用具有产品代码但结构不同的类似交易,我仍然希望能够获得交易。

4

1 回答 1

1

您应该在按产品代码过滤交易时使用Any()而不是Where(),因为谓词应该返回布尔值

from t in xdoc.Descendants("MyTransactionXML")
where t.Descendants("ProductCode").Any(c => (string)c == "DEF") // here
select t

与 lambda 语法相同:

xdoc.Descendants("MyTransactionXML")
     .Where(t => t.Descendants("ProductCode").Any(c => (string)c == "DEF"))

或者您可以使用 XPath 扩展

xdoc.XPathSelectElements("//MyTransactionXML[*/ProductCode='DEF']");

*通配符匹配任何节点,因此您将处理 xml 结构的更改

于 2013-06-10T13:54:16.727 回答