为什么我必须将其他实体包括到我的 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