如何检查延迟加载propery是否返回null(重新制定)

时间:2014-08-27 08:31:04

标签: linq entity-framework

这最初发布在这里:
How to check if a lazy loading propery returns null ..但没有回答,可能是由于问题和支持代码不够清楚。 (我想删除它,但不确定这是否会影响我发布的能力)

我认为这个问题很有价值,所以我为了清楚起见重新制定了这个问题:

以下代码:

var itinerary = context.Itineraries
.Include(i => i.ItineraryDays.Select(id => id.Listing.Port.Country))
.Include(i => i.ItineraryStartDates)
.Where(i => i.Id == Id).FirstOrDefault();

将数据传递给视图,该视图会抛出异常'对象引用未设置为对象的实例',代码如下**:

@foreach (var d in Model.ItineraryDays)
    {
        <tr>
            <td>
                @Html.DisplayFor(model => d.DayPlus1)
            </td>
            <td>
                @Html.ActionLink(d.Listing.Name, "Details", "Port", new { Id = d.ListingId }, null)
            </td>
            <td>
                @if (d.Listing != null) **
                    {
                       //
                    }

有些观点:

  • d。列表总是有值,永远不会为空
  • d.Listing.Port可以返回null
  • 仅在d.Listing.Port为空时发生异常

有谁能告诉我为什么抛出异常?

更新 刚刚发现我的代码在某些情况下处理空值而不抛出异常,但并不是在每种情况下都是如此。例如1)好2)例外

1) @Html.DisplayFor(model => d.Listing.Port.Country.Name)
2) @Html.ActionLink(d.Listing.Port.Country.Name, "Details", "Country", new { Id = d.Listing.Port.Country.Id }, null)

问候,盖伊

1 个答案:

答案 0 :(得分:0)

假设您有先例,对我来说,一个可能的解决方案是:

.Include(i => i.ItineraryDays.Select(id => id.Listing.Port.Country))

这应该在命中数据库之后进行评估,并且,当Post为null时,Port.Country将抛出。

验证这个想法:

  • 检查发出的sql和/或
  • .Include(i => i.ItineraryDays.Select(id => id.Listing.Port != null ?id.Listing.Port.Country : null))