2016-11-21 69 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