2013-10-25 32 views
1

我查詢一個xml,我使用singleordefault的LINQ to XML單個或默認

var query = from nm in xelement.Descendants("EmployeeFinance") 
       where (int)nm.Element("EmpPersonal_Id") == empID 
       select new AllowancePaid 
       { 
        gradeTaxId = nm.Element("Allow-GradeTax").Elements("Amount").Attributes("BenListId").Select(a => (int)a).ToList(), 
        gradeTaxAmt = nm.Element("Allow-GradeTax").Elements("Amount").Select(a => (double)a).ToList() 
       }; 
    Debug.WriteLine("2"); 
    var resultquery = query.SingleOrDefault(); 

現在這條線存儲結果:如果在xml文件中找到var resultquery = query.SingleOrDefault();工作正常。但是,我有我的查詢會導致null的情況。如果我沒有價值,它會在xml文件中輸入,我的查詢顯然會導致null。我的問題是我如何迎合這一點,而不會導致我的程序崩潰。顯然,singleordefault()不起作用。

** * ** * ** * ** * ** * ** EDITED * ** * ** * ** * ** * ** * ** * ** * ***

我讀什麼大家都表示,到目前爲止,它是有意義,但我仍然有一個問題。

if (query.Count() == 0) 
    { 
     Debug.WriteLine("NULL"); 


    } 
    else { 
     var resultquery = query.SingleOrDefault();    
     Debug.WriteLine("NOT NULL"); 
    } 

OR

 if (query == null) 
     { 
      Debug.WriteLine("NULL"); 


     } 
     else { 
      var resultquery = query.SingleOrDefault();    
      Debug.WriteLine("NOT NULL"); 
     } 

OR

var resultquery = query.SingleOrDefault(); 
    if (resultquery == null) 
    { 
     Debug.WriteLine("NULL Result"); 
    } 
    else 
    { 
     Debug.WriteLine("NOT NULL"); 
    } 

我得到一個System.NullReferenceException錯誤時,if語句的第一部分是真實的。一位用戶說要這樣做:var resultquery = query.SingleOrDefault();然後使用我的if..else語句進行比較。不過,我在分配query.singleofdefault()resultquery時發生錯誤。所以我迷失了..希望有人能幫忙。謝謝

+0

爲什麼不檢查'null',只是插入值? – Stefan

+1

我編輯了你的標題和標籤,以反映這是特定於'Linq-to-XML'而不是'Linq-to-Entities' – Khan

+0

我該如何檢查null? –

回答

2

什麼,我試圖理解是這樣的。該文檔指出結果查詢是否爲0,它會給出一個默認值,如果不是,它將是一個單一的值。所以爲什麼不給這個默認值呢? [從註釋採取]

null引用類型的默認值。顯然AllowancePaid是一個參考類型(自定義class)。

+0

非常感謝。這有助於。 –

+0

請檢查編輯部分的問題。我仍然有一些問題。 –

1

當沒有找到值時,你想要什麼值。

你可以做兩種:

if (resultquery == null) { 
    // Logic for No result 
} else { 
    // Logic for result found 
} 

或者你可以強制默認值

如。

var resultquery = query.SingleOrDefault() ?? new AllowancePaid(); 

UPDATE

從發表的評論,似乎空引用異​​常查詢本身內,而不是由實際分配引起resultquery和使用更高版本。

此更新的查詢應該可以解決這個問題

var query = from nm in xelement.Descendants("EmployeeFinance") 
      where nm.Element("EmpPersonal_Id") != null 
        && (int)nm.Element("EmpPersonal_Id") == empID 
        && nm.Element("Allow-GradeTax") != null 
        && nm.Element("Allow-GradeTax").Elements("Amount") != null 
      select new AllowancePaid 
      { 
       gradeTaxId = nm.Element("Allow-GradeTax").Elements("Amount").Attributes("BenListId").Select(a => (int)a).ToList(), 
       gradeTaxAmt = nm.Element("Allow-GradeTax").Elements("Amount").Select(a => (double)a).ToList() 
      }; 

var resultquery = query.SingleOrDefault(); 

if (resultquery == null) { 
    Debug.WriteLine("NULL Result"); 
} else { 
    // Logic here 
} 
+0

我想知道的是這個。該文檔指出結果查詢是否爲0,它會給出一個默認值,如果不是,它將是一個單一的值。所以爲什麼不給這個默認值呢? –

+0

@DineshPersaud - 正如我在我的評論中,null *是*引用類型的默認值。 – Tim

+0

@DineshPersaud它確實給出了默認值。一個類的默認值是'null'。如果您的查詢返回一個整數,則值爲0,因爲0是int的默認值。要測試放'var test = default(AllowancePaid)'test將等於null。 –