为什么我必须将其他实体包括到我的 Linq 查询中?
Why do I have to Include other entities into my Linq query?
在下面的查询中,为什么我必须将相关实体包含在我的查询中才能为它们获取值。我的意思是为什么延迟加载似乎不起作用,我必须改为进行预加载?
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)
if
条件中的 CreatorUserId
会抛出异常,因为如果我不使用 Include()
,HitchRequest
将为空。
Inclue()
方法提供了预加载而不是延迟加载。我正在根据我的知识向您解释两者之间的区别。
延迟加载。它只为实体本身提供记录,并且每次 相关数据(在你的情况下 HitchRequest
)
实体必须被检索。 DbContext
class 给你偷懒
默认加载。
预加载。当实体被读取时,相关数据也随之被检索。这通常会导致单个连接查询
检索所有需要的数据。您通过以下方式指定预加载
使用 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 and Eager Loading in Entity Framework
在下面的查询中,为什么我必须将相关实体包含在我的查询中才能为它们获取值。我的意思是为什么延迟加载似乎不起作用,我必须改为进行预加载?
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)
if
条件中的 CreatorUserId
会抛出异常,因为如果我不使用 Include()
,HitchRequest
将为空。
Inclue()
方法提供了预加载而不是延迟加载。我正在根据我的知识向您解释两者之间的区别。
延迟加载。它只为实体本身提供记录,并且每次 相关数据(在你的情况下
HitchRequest
) 实体必须被检索。DbContext
class 给你偷懒 默认加载。预加载。当实体被读取时,相关数据也随之被检索。这通常会导致单个连接查询 检索所有需要的数据。您通过以下方式指定预加载 使用
Include
方法。
没有 Include()
的第一个语句等同于下面的语句,这就是为什么 HitchRequest
如果不使用 Include()
:
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 and Eager Loading in Entity Framework