我正在使用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);
我需要在索引页面中显示这两列。
答案 0 :(得分:0)
FirstOrDefault()
可能会返回null
,
类型: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时,您可以使用空条件运算符将GoodsCarried
和VoyagePurpose
设置为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(...)