让我们假设这种情况
实体
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表达式中的getter内部使用代码,那么它将起作用。
这意味着使用吸气剂在EFCore中不起作用。
答案 0 :(得分:4)
您是对的,它不起作用。而且我认为永远不会。
EF Core当前在client evaluation的导航属性(延迟或渴望加载)方面存在问题。这是下一个EF Core主要版本(3.0)中客户评估will be removed的原因之一。使用这种表达式的查询只会抛出类似于EF6的异常。
请记住,请不要在LINQ to Entities查询中使用此类“ helper”属性。从OOP和可重用性的角度来看,我知道这很好,但是LINQ查询转换在封装方面不能很好地发挥作用,因为它是基于知识的,需要查看模型映射到数据库的所有内容背后的代码(表达式)。 >
您已经知道有效的解决方案,只需使用它即可。或看看像3rd party extensions这样的NeinLinq.EntityFrameworkCore,它们试图解决可重用性问题。