Entity Framework 核心 - 延迟加载不适用于 Getters

Entity Framework Core - Lazy Loading not working for Getters

让我们假设这种情况

实体

public virtual List<Address> AddressHistory { get; set; }

public Address Address
{
    get
    {
        if (AddressHistory.Any())
        {
            return AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault();
        }

        return null;
    }
}

根据条件请求地址时,如下所示:

dbContext.MyEntity.Where(e => e.Address.Street == "some stuff");

我得到一个空引用异常。

为什么?有没有办法让它发挥作用?

编辑:对于那些认为地址可能为空的人,这样做是有效的:

dbContext.MyEntity.Where(e => e.AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault().Street == "some stuff");

编辑:对于将其标记为重复的人,我认为您不了解这里的问题。请去掉标记。

所以,总结一下:

如果我使用 getter => null 异常,因为子项 (AdressHistory) 不是惰性加载的。 如果我直接在 efcore 表达式中使用 getters 中的代码,它就可以工作。

这意味着使用 getter 在 EFCore 中不起作用。

你是对的,它不起作用。而且我认为它永远不会。

EF Core 当前在下一个 EF Core 主要版本 (3.0) 中存在 client evaluation of navigation properties (both lazy or eager loaded). This is one of the reasons client evaluation will be removed 问题。使用此类表达式的查询将简单地抛出类似于 EF6 的异常。

考虑到所有这些,不要在 LINQ to Entities 查询中使用此类 "helper" 属性。从 OOP 和可重用性的角度来看,我知道这很好,但是 LINQ 查询转换不能很好地与封装一起使用,因为它基于知识并且需要查看所有内容背后的代码(表达式),而不是模型映射到数据库的一部分。

您已经知道有效的解决方案,只需使用它即可。或者看看 3rd party extensions like NeinLinq.EntityFrameworkCore,它试图解决可重用性问题。