ISNULL () в LINQ to XML - PullRequest
       21

ISNULL () в LINQ to XML

1 голос
/ 05 октября 2009

ВЫБРАТЬ * ОТ КЛИЕНТОВ ГДЕ RTRIM (ISNULL ([SHORTNAME], '')) LIKE '% john%'

Я хочу написать это с помощью Linq,

var persons = from person in xmlDoc.Descendants("Table")
where 
person.Element("SHORTNAME").Value.Contains("123")
select new
{
  shortName = person.Element("SHORTNAME").Value,
  longName = person.Element("LONGNAME").Value,
  address = person.Element("ADDRESS").Value,
  Phone = person.Element("PHONE") != null ? person.Element("PHONE").Value : "",
  zip = person.Element("ZIPCODE") != null ? person.Element("ZIPCODE").Value : "",
};

Это прекрасно работает, когда [SHORTNAME] не равно нулю, если [SHORTNAME] является нулевым значением, это нарушает код и выдает «Исключение нулевой ссылки»

Пожалуйста, помогите мне ...

Ответы [ 2 ]

2 голосов
/ 05 октября 2009

Предполагается, что вы пытаетесь не брать что-нибудь там, где не короткое имя ...

var persons = from person in xmlDoc.Descendants("Table")
    let shortNameElement = person.Element("SHORTNAME") 
    where shortNameElement != null && shortNameElement.Value.Contains("123")
    select new
    {
        shortName = person.Element("SHORTNAME").Value,
        longName = person.Element("LONGNAME").Value,
        address = person.Element("ADDRESS").Value,
        Phone = person.Element("PHONE") != null ? 
            person.Element("PHONE").Value : "",
        zip = person.Element("ZIPCODE") != null ? 
            person.Element("ZIPCODE").Value : "",
    };

Кроме того, вы можете использовать оператор объединения нулей, чтобы сделать все это немного проще:

var emptyElement = new XElement("ignored", "");

var persons = from person in xmlDoc.Descendants("Table")
    where (person.Element("SHORTNAME") ?? emptyElement).Value.Contains("123")
    select new
    {
        shortName = person.Element("SHORTNAME").Value,
        longName = person.Element("LONGNAME").Value,
        address = person.Element("ADDRESS").Value,
        Phone = (person.Element("PHONE") ?? emptyElement).Value
        zip = (person.Element("ZIPCODE") ?? emptyElement).Value
    };

Или вы можете написать метод расширения:

public static string ValueOrEmpty(this XElement element)
{
    return element == null ? "" : element.Value;
}

и затем используйте его так:

var persons = from person in xmlDoc.Descendants("Table")
    where person.Element("SHORTNAME").ValueOrEmpty().Contains("123")
    select new
    {
        shortName = person.Element("SHORTNAME").Value,
        longName = person.Element("LONGNAME").Value,
        address = person.Element("ADDRESS").Value,
        Phone = person.Element("PHONE").ValueOrEmpty(),
        zip = person.Element("ZIPCODE").ValueOrEmpty()
    };
0 голосов
/ 05 октября 2009

Используйте оператор объединения нулей:

Phone = person.Element("PHONE") ?? String.Empty;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...