2011-08-08 6 views
3

비슷한 속성을 기반으로 고유 한 이름을 선택하려고하는 LinqToXML 표현식이 있습니다. 코드는 중대한 작동하고 나는 아래에 넣어했습니다LinqToXML 표현식에서 null 속성을 확인하는 방법은 무엇입니까?

  var q = xmlDoc.Element("AscentCaptureSetup").Element("FieldTypes") 
      .Descendants("FieldType") 
      .Select(c => new { width = c.Attribute("Width").Value, 
           script = c.Attribute("ScriptName").Value, 
           sqlType = c.Attribute("SqlType").Value, 
           enableValues = c.Attribute("EnableValues").Value, 
           scale = c.Attribute("Scale").Value, 
           forceMatch = c.Attribute("ForceMatch").Value, 
           forceMatchCaseSensitive = c.Attribute("ForceMatchCaseSensitive").Value, 
           sortAlphabetically = c.Attribute("SortAlphabetically").Value, 
          }) 
      .Distinct(); 

모든 속성이 필요하기 때문에 문제가 발생, 그 중 하나가 생략 된 경우, sortAlphabetically 예를 , 나는 개체를하지 얻을 참조 된 오류. 의미가 있지만 실제로 속성이 존재하는 경우에만 새 값을 할당하도록 쿼리를 변경하는 방법이 있습니까? (null 참조에 날려 버리겠다)을 Value 속성을 사용하는 대신

답변

5

을 (이것에 null 포인터 오류를 우회), 단순히 문자열로 XAttribute 캐스트 - 당신거야 중 하나 얻을 값, 또는XAttribute 참조가 null 인 경우는 null 참조. (XElement 같은 방식으로 작동하고,이 nullable 형식에 모든 변환에 적용됩니다.)

그래서 당신은 할 것 :

.Select(c => new { 
    width = (string) c.Attribute("Width"), 
    script = (string) c.Attribute("ScriptName"), 
    sqlType = (string) c.Attribute("SqlType"), 
    enableValues = (string) c.Attribute("EnableValues"), 
    scale = (string) c.Attribute("Scale"), 
    forceMatch = (string) c.Attribute("ForceMatch"), 
    forceMatchCaseSensitive = (string) c.Attribute("ForceMatchCaseSensitive"), 
    sortAlphabetically = (string) c.Attribute("SortAlphabetically"), 
}) 

이러한 속성 중 일부는 그들이 실제로int?으로 캐스팅해야 같은 소리 또는 bool?, 내 생각에 ...

+0

Doh! 너 커피 마시고 나도 안했어. 캐스트에 잘 잡히면 훌륭하게 작동합니다. 멀고 캐스팅 유형은 중요하지 않으므로 이러한 변수는 로그 출력을 생성하는 데만 사용됩니다. 고마워요 존 –

관련 문제