在下面的查询中,为什么我必须将相关实体包含在我的查询中以获取它们的值。我的意思是为什么懒惰加载似乎不起作用,我不得不做Eager-loading?
var acceptedHitchRequest = await _acceptedRequestRepository.GetAll()
.Include(p => p.HitchRequest)
.Include(p => p.CarparkRequest)
.Include(p => p.HitchRequest.User)
.Include(p => p.CarparkRequest.User)
.Where(p => (input.HitchRequestId.HasValue ? p.HitchRequest.Id == input.HitchRequestId : p.CarparkRequest.Id == input.CarparkRequestId)
&& p.IsActive).FirstOrDefaultAsync();
if (input.HitchRequestId.HasValue && acceptedHitchRequest.HitchRequest.CreatorUserId == AbpSession.UserId)
在CreatorUserId
条件下的if
将抛出异常,因为如果我不使用HitchRequest
,Include()
将为null。
Inclue()
方法提供急切加载而不是延迟加载。我根据我的知识向你解释两者之间的区别。
HitchRequest
)。 DbContext
类默认为您提供延迟加载。Include
方法指定预先加载。没有Include()
的第一个语句等同于下面的语句,这就是为什么如果你不使用HitchRequest
,Include()
为null:
SELECT * FROM AcceptedRequest;
使用Include("HitchRequest.User")
的声明等同于以下声明:
SELECT * FROM AcceptedRequest JOIN Orders ON AcceptedRequest.Id = HitchRequest.User.AcceptedRequestId;
你可以参考this非常有用的文章。
Entity Framework Loading Related Entities,Eager Loading和Eager Loading in Entity Framework