2009-10-05 2 views
1

SELECT * FROM КЛИЕНТАМ ГДЕ RTRIM (ISNULL ([SHORTNAME], '')) LIKE '% джон%'ISNULL() в LINQ к XML

Я хочу написать это с помощью 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] имеет нулевое значение это ломает код и всплывает «нулевой ссылки Exception»

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

ответ

2

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

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

Используйте пустой оператор коалесцирующий:

Phone = person.Element("PHONE") ?? String.Empty; 
+0

Это не будет работать, так как элемент возвращает XElement, а не строка. –

+0

Мое плохое, казалось, просто в тот момент, когда я это написал. –