为什么我必须在Linq查询中包含其他实体?

问题描述 投票:0回答:1

在下面的查询中,为什么我必须将相关实体包含在我的查询中以获取它们的值。我的意思是为什么懒惰加载似乎不起作用,我不得不做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将抛出异常,因为如果我不使用HitchRequestInclude()将为null。

entity-framework asp.net-core lazy-loading aspnetboilerplate ef-core-2.0
1个回答
0
投票

Inclue()方法提供急切加载而不是延迟加载。我根据我的知识向你解释两者之间的区别。

  • 懒加载。它只为实体本身提供记录,每次必须检索实体的相关数据(在您的情况下为HitchRequest)。 DbContext类默认为您提供延迟加载。
  • 渴望加载。读取实体时,将同时检索相关数据。这通常会导致单个连接查询检索所需的所有数据。您可以使用Include方法指定预先加载。

没有Include()的第一个语句等同于下面的语句,这就是为什么如果你不使用HitchRequestInclude()为null:

SELECT * FROM AcceptedRequest;

使用Include("HitchRequest.User")的声明等同于以下声明:

SELECT * FROM AcceptedRequest JOIN Orders ON AcceptedRequest.Id = HitchRequest.User.AcceptedRequestId;

你可以参考this非常有用的文章。

Entity Framework Loading Related EntitiesEager LoadingEager Loading in Entity Framework

© www.soinside.com 2019 - 2024. All rights reserved.