Ссылка на объект C # LINQ не задана

Учитывая следующий код

IEnumerable query = null;    
query = from x in xml.Descendants(xmlMasterContainerName).Descendants(xmlElementName)
                    let guid = x.Attribute("guid") ?? new XAttribute("guid", "-1")
                    where x.Attribute(xmlAttributeIdName).Value == xmlAttributeIdValue
                    select guid.Value;

Я получаю «ссылку на объект не установлен» при попытке query.ToList ()

Вероятно, это вызвано «select guid.Value», когда «x.Attribute (xmlAttributeIdName) .Value == xmlAttributeIdValue» не существует.

Как я могу проверить оператор where для существующего значения перед выбором? благодаря

1
nl ja de
Вы можете сделать , где/* объект существует */&&/* объект в порядке */
добавлено автор Nolonar, источник

4 ответы

В XLinq вы обычно не используете Attribute (). Значение напрямую, из-за точной ошибки, которую вы получаете. Вместо этого вы бросаете его. Приведение приводит к null , если Attribute() возвращается null, поэтому исключений не будет.

Итак, вы бы изменили свое предложение:

where ((string)x.Attribute(xmlAttributeIdName)) == xmlAttributeIdValue

и ваш выбор:

select (string)guid

BTW: Я бы написал этот код следующим образом:

var query = xml.Descendants(xmlMasterContainerName)
               .Descendants(xmlElementName)
               .Where(x => ((string)x.Attribute(xmlAttributeIdName)) ==
                               xmlAttributeIdValue)
               .Select(x => (string)x.Attribute("guid") ?? "-1");
3
добавлено

В XLinq вы обычно не используете Attribute (). Значение напрямую, из-за точной ошибки, которую вы получаете. Вместо этого вы бросаете его. Приведение приводит к null , если Attribute() возвращается null, поэтому исключений не будет.

Итак, вы бы изменили свое предложение:

where ((string)x.Attribute(xmlAttributeIdName)) == xmlAttributeIdValue

и ваш выбор:

select (string)guid

BTW: Я бы написал этот код следующим образом:

var query = xml.Descendants(xmlMasterContainerName)
               .Descendants(xmlElementName)
               .Where(x => ((string)x.Attribute(xmlAttributeIdName)) ==
                               xmlAttributeIdValue)
               .Select(x => (string)x.Attribute("guid") ?? "-1");
3
добавлено

Если атрибут xmlAttributeIdName отсутствует, вы получите исключение, получившее доступ к свойству Value . Вместо этого используйте casting (он вернет значение по умолчанию). Также вам не нужно создавать атрибут - вы можете просто вернуть значение:

IEnumerable query = null;    
query = from x in xml.Descendants(xmlMasterContainerName)
                     .Descendants(xmlElementName)
        where (string)x.Attribute(xmlAttributeIdName) == xmlAttributeIdValue
        select (string)x.Attribute("guid") ?? "-1";
2
добавлено

Если атрибут xmlAttributeIdName отсутствует, вы получите исключение, получившее доступ к свойству Value . Вместо этого используйте casting (он вернет значение по умолчанию). Также вам не нужно создавать атрибут - вы можете просто вернуть значение:

IEnumerable query = null;    
query = from x in xml.Descendants(xmlMasterContainerName)
                     .Descendants(xmlElementName)
        where (string)x.Attribute(xmlAttributeIdName) == xmlAttributeIdValue
        select (string)x.Attribute("guid") ?? "-1";
2
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot