2016-11-21 74 views
0

我有一個LINQ查詢,在我的DAL與EF正常工作:如何在LINQ結果檢查的NullReferenceException

 using (var mLEntities = new myLab02Entities1()) 
     { 
      var test = from c in mLEntities.Chemicals 
         from u in c.Usages 
         select new 
         { 
          cChemID = c.Chem_ID, 
          c.Name, 
          c.Supplier, 
          c.Grade, 
          c.OrderNo, 
          c.BatchNo, 
          c.EntryDate, 
          c.CreatedBy, 
          cUser = u.Person.PersName, 
          uChemID = u.Chem_ID, 
          u.Study_ID, 
          u.UsedBy, 
          uUser = u.Person.PersName, 
          u.UseDate, 
          u.Project.StudyNo, 
          u.Project.ProjectName, 
         }; 

用法是化學品的導航性能(1種化學:N USA),和人與項目都是用法的導航屬性(均爲1:1)。 後來我想把這個查詢我的業務邏輯和寫道:

 IList<ChemicalBDO> chemicalListBDO = chemListDAO.GetChemicalsListFromDB(); 

     var test = from c in chemicalListBDO 
        from u in c.Usages 
        select new 
        { 
         cChemID = c.Chem_ID, 
         c.Name, 
         c.Supplier, 
         c.Grade, 
         c.OrderNo, 
         c.BatchNo, 
         c.EntryDate, 
         c.CreatedBy, 
         cUser = u.Person.PersName, 
         uChemID = u.Chem_ID, 
         u.Study_ID, 
         u.UsedBy, 
         uUser = u.Person.PersName, 
         u.UseDate, 
         u.Project.StudyNo, 
         u.Project.ProjectName 
        }; 

也就是說,我首先查詢我的EF的DbContext拿到我的化學實體,而且比我寫的對這種化學實體的查詢。 對我來說,奇怪的是,最後的代碼拋出一個System.NullReferenceExeption,因爲u.Person和u.Project可以爲NULL。但是第一個查詢不會拋出異常,這是什麼原因? 我如何處理在選擇查詢的空引用,我可以檢查NULL用「如果」,「?」要麼 」??」 ?

順便說一句:我想有在DAL複雜的查詢是沒有良好的編程習慣,這是真的還是我可以讓代碼呢? 任何幫助表示讚賞。

+0

你見過這樣的職位? http://stackoverflow.com/a/14260113/821681 –

+0

約翰尼:我沒有看到過那個帖子,我會看看吧,謝謝。 Hucky – Hucky

+0

隨時。我不確定它是否能完全解決您的問題,但看起來它有潛力,因此我決定分享它。祝你好運! –

回答

0

這應該可以解決這個問題:

IList<ChemicalBDO> chemicalListBDO = chemListDAO.GetChemicalsListFromDB(); 

    var test = from c in chemicalListBDO 
       from u in c.Usages 
       select new 
       { 
        cChemID = c.Chem_ID, 
        c.Name, 
        c.Supplier, 
        c.Grade, 
        c.OrderNo, 
        c.BatchNo, 
        c.EntryDate, 
        c.CreatedBy, 
        cUser = u.Person != null ? u.Person.PersName : string.Empty, 
        uChemID = u.Chem_ID, 
        u.Study_ID, 
        u.UsedBy, 
        uUser = u.Person != null ? u.Person.PersName : string.Empty, 
        u.UseDate, 
        u.Project != null ? u.Project.StudyNo : -1, 
        u.Project != null ? u.Project.ProjectName : string.Empty 
       }; 
+0

brugi82你好:我測試你的建議,但它不工作。我認爲問題是整個對象u.Person和u.Project都是NULL,而不僅僅是PersName和StudyNo屬性。哈基 – Hucky

+0

那麼如果是這樣的情況下解決方案將工作。您看到我們正在檢查u.Person是否爲空,然後我們正在訪問u.Person.PersName。如果它爲空,那麼我們只設置string.Empty。 – brugi82

+0

如果c.Usages爲空,您確定c.Usages不爲null嗎?這也可能會引起空引用異常。 – brugi82