代码之家  ›  专栏  ›  技术社区  ›  Mohammad Shadmehr

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

  •  0
  • Mohammad Shadmehr  · 技术社区  · 7 年前

    在下面的查询中,我为什么必须将相关实体包括到查询中才能获得它们的值。我的意思是,为什么懒散的加载似乎不起作用,而我必须做急切的加载呢?

    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()

    1 回复  |  直到 7 年前
        1
  •  0
  •   Martijn Pieters    7 年前

    Inclue() 方法提供即时加载而不是延迟加载。根据我的知识,我向你解释这两者的区别。

    • 延迟加载。 它只为实体本身提供记录,每次 相关数据 (在你的情况下 HitchRequest )用于 必须检索实体。这个 DbContext 课堂让你懒惰 默认情况下正在加载。

    • 渴望加载。 读取实体时,会同时检索相关数据。这通常会导致一个连接查询 检索所需的所有数据。您可以通过以下方式指定即时加载 使用 Include 方法

    第一句话没有 Include() 相当于下面的陈述,这就是为什么 HitchRequest公司 如果不使用 包括() :

    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

    推荐文章