让我们假设这种情况
实体
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");
我得到一个空引用异常。
为什么?有没有办法让它发挥作用?
编辑:对于那些认为 Address 可能为空的人,这样做是有效的:
dbContext.MyEntity.Where(e => e.AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault().Street == "some stuff");
编辑:对于将其标记为重复的人,我认为您不了解这里的问题。请去掉标记。
所以,总结一下:
如果我使用 getter => null 异常,因为子项 (AdressHistory) 不是延迟加载的。 如果我直接在 efcore 表达式中使用 getter 中的代码,它就可以工作。
这意味着使用 getter 在 EFCore 中不起作用。
最佳答案
你是对的,这是行不通的。而且我认为它永远不会。
EF Core 目前在 client evaluation 方面存在问题导航属性(延迟加载或急切加载)。这是客户评价的原因之一will be removed在下一个 EF Core 主要版本 (3.0) 中。使用此类表达式的查询将简单地抛出类似于 EF6 的异常。
考虑到所有这些,不要在 LINQ to Entities 查询中使用此类“帮助器”属性。从 OOP 和可重用性的角度来看,我知道这很好,但 LINQ 查询转换不能很好地与封装一起使用,因为它基于知识并且需要查看所有内容背后的代码(表达式),而不是模型映射到数据库的一部分。
您已经知道可行的解决方案,只需使用它即可。或者看看 3rd party extensions喜欢NeinLinq.EntityFrameworkCore它试图解决可重用性问题。
关于c# - Entity Framework Core - 延迟加载不适用于 Getters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673507/