我有一个带有这样的节点的XML源(Somewhat anonymousized):
<XXX>
<Code A="oa ">01</Code>
<Name A="oa ">Card</Name>
<F1 A="oa ">x</F1>
<F2 A="oa ">y</F2>
<F3 A="oa ">z</F3>
</XXX>
我将XML文档加载到XElement中并使用linq
进行查询var query = from creditcard in xml.Descendants("XXX")
where creditcard.Element("Code").Value == "1"
select new
{
Id = Convert.ToInt32(creditcard.Element("Code").Value),
Description = creditcard.Element("Name").Value,
xx = creditcard.Element("F1").Value,
yy = creditcard.Element("F2").Value,
zz = creditcard.Element("F3").Value
};
当我在LinqPad中转储查询时,这将导致空集。但是,如果我将where子句更改为:
where Convert.ToInt32(creditcard.Element("Code").Value) == 1
然后它会正确找到有问题的项目。任何想法为什么它以这种方式工作或我错过了什么?
编辑:对不起,我错过了将“Kod”更改为Code,因为我将其更改为发布。现在修好了。答案 0 :(得分:4)
因为值为“01”,而不是“1”。转换为Int32会掩盖这种差异。
答案 1 :(得分:0)
当您对字符串进行第一次比较时,您尝试将“01”与“1”进行比较,这显然是不一样的。通过将“01”转换为整数值,您将得到一个值为1的int,因此这次您的比较正确。
答案 2 :(得分:0)
查询不起作用,因为您必须处理兄弟元素而不是子元素。
您的查询适用于:
<XXX>
<Code>
<Kod A="oa ">01</Kod>
<Name A="oa ">Card</Name>
<F1 A="oa ">x</F1>
<F2 A="oa ">y</F2>
<F3 A="oa ">z</F3>
</Code >
</XXX>
但即便如此,只有修改
where creditcard.Element("Code").Value == "1"
到
where creditcard.Element("Code").Element("Kod").Value == "01"