gpt4 book ai didi

linq - 出于数据库性能原因,我应该具体化我的 LINQ 查询吗?

转载 作者:行者123 更新时间:2023-12-04 21:49:15 27 4
gpt4 key购买 nike

我有以下代码:

var result = Database.Set<Product>()
.Where(x => x.Product.CreatedAt >= fromDate
&& x.Product.CreatedAt <= toDate);

var group1 = result
.GroupBy(x => new { Id = x.Id, Name = x.Name })
.Select(x => new { Id = x.Key.Id, Name = x.Key.Name });
var group2 = result
.GroupBy(x => new { Id = x.Id, Price = x.Price })
.Select(x => new { Id = x.Key.Id, Name = x.Key.Price });
var group3 = result
.GroupBy(x => new { Id = x.Id, Category = x.Category })
.Select(x => new { Id = x.Key.Id, Name = x.Key.Category });

请不要关注 GroupBy 条件。让我们假设我需要三组中的数据进行一些进一步的处理。

我假设上面的代码可能会触发至少三个 SQL 查询来生成结果。这样做会不会不正确?
var result = Database.Set<Product>()
.Where(x => x.Product.CreatedAt >= fromDate
&& x.Product.CreatedAt <= toDate)
.ToList();

在这一点上,我假设只有一个 SQL 调用来获取结果集并将其放入内存中。我进一步假设三个 GroupBy 操作将在内存集合上执行,而不是触发更多的 SQL 查询。

我的推理正确吗?这种方法有什么好处/坏处吗?

最佳答案

你的推理是对的,调用 ToList() 只会用一个 SQL 查询将数据拉入本地内存,然后后续的 group 和 select 操作将只在本地内存中执行。

由于您后续的 Linq 查询只是对数据重新排序,因此将其传递给 SQL 服务器并以不同的顺序多次下载数据并没有什么好处。主要优点是减少客户端上的内存占用。如果数据太大,本地机器放不下,那么就得在SQL服务器上进行分组,分段下拉到客户端。

如果后续的 Linq 查询进一步过滤数据,而不仅仅是重新排序,那么在第一个查询上使用 .ToList 的决定就不那么明确了。第一个查询可能会提取比您需要的更多的数据,这很容易比进行三个查询(每个查询仅提取少量数据)的成本更高。

有利于在一个查询中提取数据并在本地内存中重新排序的另一个因素是三个最终结果集之间的数据一致性。如果您运行 3 个 SQL 查询,由于服务器上同时发生更新,您可能会在每个查询中得到不同的结果。通过一次拉取数据,您可以对数据进行快照,将其与并发更新隔离开来,这保证了三个分组包含完全相同的数据,只是顺序不同。

关于linq - 出于数据库性能原因,我应该具体化我的 LINQ 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083024/

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