gpt4 book ai didi

c# - 如何获取 EF 查询来编译最优化的 SQL?

转载 作者:行者123 更新时间:2023-11-30 16:48:00 24 4
gpt4 key购买 nike

我是 EF 的新手,这几天一直困扰着我:

我有一个用户实体。它有一个父工作区,其中有一个用户集合。每个用户在 User.Schedules 属性中还有一个子计划集合。

我正在像这样浏览对象:

var query = myUser.WorkSpace.Users.SelectMany(u => u.Schedules); 

在枚举 query 的结果时(myUser 是之前使用 .Find(userid) 加载的 User 的一个实例),我注意到 EF 对 db 中的每个用户进行了一次查询工作区.用户

为什么 EF 不能在单个查询中获得结果,从 myUser 的主键开始,并加入所有涉及的表?

如果我直接从上下文中做其他事情,比如这样,它工作正常:

context.Users.Where(u => u.ID = userid).SelectMany(u => u.WorkSpace.Users.SelectMany(u => u.Schedules))

我做错了什么吗?

最佳答案

让我们来看第一个查询:

var query = myUser.WorkSpace.Users.SelectMany(u => u.Schedules);

如果您查看 query类型变量,你会看到它是 IEnumerable<Schedule> ,这意味着这是一个常规的 LINQ to Objects 查询。为什么?因为它从物化对象开始,然后加入另一个对象/集合等。这与 EF 延迟加载特性相结合导致了多数据库查询行为。

如果您对第二个查询执行相同的操作:

var query = context.Users.Where(u => u.ID = userid)
.SelectMany(u => u.WorkSpace.Users.SelectMany(u => u.Schedules))

你会注意到 query 的类型现在是IQueryable<Schedule> ,这意味着现在您有一个 LINQ to Entities 查询。这是因为 context.Users查询中使用的其他对象/集合也不是真实对象——它们只是用于构建、执行和具体化查询的元数据。

总而言之,您没有做错什么。延迟加载就是这样工作的。如果你不关心所谓的N+1 query问题,您可以使用第一种方法。如果您确实关心,请使用第二种。

关于c# - 如何获取 EF 查询来编译最优化的 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38632203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com