2009-10-05 81 views
1

SELECT * FROM CUSTOMERS WHERE RTRIM(ISNULL([SHORTNAME], ''))LIKE '%約翰%'ISNULL()在LINQ to 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]是一個空值這個breakes的代碼,並彈出一個「空引用異常」

請幫我...

回答

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,而不是一個字符串。 – 2009-10-05 11:31:39

+0

我的不好,在我寫下它的時刻似乎很簡單。 – 2009-10-05 11:36:56