在LINQ中使用字符串比较的奇怪结果

时间:2010-02-26 12:58:32

标签: c# linq linq-to-xml

我有一个带有这样的节点的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,因为我将其更改为发布。现在修好了。

3 个答案:

答案 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"