Странный результат со сравнением строк в LINQ - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть источник XML с такими узлами (как-то анонимно):

<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

Тогда он правильно найдет данный предмет. Любые идеи, почему это работает таким образом или что я пропустил?

РЕДАКТИРОВАТЬ: Извините, я пропустил, чтобы изменить "Код" на код, как я изменил его для публикации. Исправлено сейчас.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2010

Поскольку значение равно «01», а не «1». Преобразование в Int32 маскирует эту разницу.

0 голосов
/ 26 февраля 2010

Запрос не работает, так как вам придется обрабатывать родные элементы, а не дочерние элементы.

Ваш запрос работает для:

<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"
0 голосов
/ 26 февраля 2010

Поскольку ваше первое сравнение выполняется по строке, вы пытаетесь сравнить «01» с «1», что, очевидно, не то же самое. Преобразовав «01» в целочисленное значение, вы получите целое число со значением = 1, поэтому на этот раз ваше сравнение будет правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...