对象引用未在mvc5中设置错误

时间:2016-06-16 05:11:21

标签: linq asp.net-mvc-5

我正在使用viewmodel来显示来自两个表(Eta和Voyage)的数据,并且我使用了viewmodel名称作为'EtaVoyage'。问题是当我使用此查询时,它给了我这个错误 附加信息:未将对象引用设置为对象的实例。

var Test = db.Etas.AsEnumerable().Select(v => new EtaVoyage()
        {
            ShippingAgent = v.ShippingAgent,
            VesselInformation = v.VesselInformation,
            Port = v.Port,
            CPort = v.CPort,
            EtaDate = v.EtaDate,
            GoodsCarried = v.VoyageDetails.FirstOrDefault().GoodsCarried,
            VoyagePurpose = v.VoyageDetails.FirstOrDefault().VoyagePurpose
        }).ToList();
        return View(Test);

但是当我评论与voyagedetails相关的最后两个字段时,它工作正常。

var Test = db.Etas.AsEnumerable().Select(v => new EtaVoyage()
        {
            ShippingAgent = v.ShippingAgent,
            VesselInformation = v.VesselInformation,
            Port = v.Port,
            CustomPort = v.CustomPort,
            EtaDate = v.EtaDate,
           // GoodsCarried = v.VoyageDetails.FirstOrDefault().GoodsCarried,
          //  VoyagePurpose = v.VoyageDetails.FirstOrDefault().VoyagePurpose
        }).ToList();
        return View(Test);

我需要在索引页面中显示这两列。

2 个答案:

答案 0 :(得分:0)

FirstOrDefault()可能会返回null

  

Enumerable.FirstOrDefault:返回值

     

类型:TSource   如果source为空,则为default(TSource);否则,源中的第一个元素。

使用

.Select(i=>i.GoodsCarried).FirstOrDefault()
        ....
        GoodsCarried = v.VoyageDetails.Select(i=>i.GoodsCarried).FirstOrDefault(),
        VoyagePurpose = v.VoyageDetails.Select(i=>i.VoyagePurpose).FirstOrDefault()
    }).ToList();

答案 1 :(得分:0)

集合v.VoyageDetails不得包含任何项目,因此First OrDefault 将返回默认值(引用类型为null)。您可以单独处理这种特殊情况,或者,因为您似乎只是在展平集合,所以当FirstOrDefault返回null时,您可以使用空条件运算符将GoodsCarriedVoyagePurpose设置为null。 p>

GoodsCarried = v.VoyageDetails.FirstOrDefault()?.GoodsCarried,
VoyagePurpose = v.VoyageDetails.FirstOrDefault()?.VoyagePurpose

请注意:

也可能
  • v.VoyageDetails 本身为空,具体取决于您的类的初始化方式和数据加载方式。如果这是预期的,您可能也需要处理这种情况。再次使用空条件运算符:

    GoodsCarried = v.VoyageDetails?.FirstOrDefault()?.GoodsCarried,
    VoyagePurpose = v.VoyageDetails?.FirstOrDefault()?.VoyagePurpose
    
  • 如果您正在使用ORM(例如Entity Framework),则不会急切地加载VoyageDetails集合,它可能根本就不是为您检索数据。如果这适用,则需要显式加载集合中的数据。在实体框架中,这是通过Include调用完成的。请注意,您的AsEnumerable()调用将阻止Linq-To-Sql将其优化为单个查询,但我认为这是故意的:

    db.Etas.Include(x => x.VoyageDetails).AsEnumerable().Select(...)