gpt4 book ai didi

c# - 使用 Func 而不是内联选择器时的 Linq2SQL n+1

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:32 25 4
gpt4 key购买 nike

我有一个包含 2 个表的 Linq2SQL 上下文,一个用于 Users和一个 Posts .最初我有这个查询:

var results = db.Users.Select(m => new UserModel
{
Id = m.Id,
DisplayName = m.DisplayName,
PostCount = m.Posts.Count(),
}).ToList();

这很有效,没有 n+1。然后我决定我想写第二个函数来以不同的方式过滤用户,我想我会聪明一点,把选择移到 Func<User, UserModel> 中。然后从我的两个查询中调用它。此查询特别更改为如下所示:

Func<User, UserModel> UserModelSelector =
m => new UserModel
{
Id = m.Id,
DisplayName = m.DisplayName,
PostCount = m.Posts.Count(),
};

var results = db.Users.Select(UserModelSelector).ToList();

直到现在,此查询才通过加载每个 User 的帖子计数来生成 n+1个别地。我已经尝试了使它成为公共(public)/私有(private)/内部、只读、静态的每一种组合,并且在所有情况下它都出现了 n+1。

谁能解释这里发生了什么?

最佳答案

您已将选择器定义为 lambda,因此 LINQ 别无选择,只能获取用户,然后依次对每个用户执行选择器,结果为 n+1。

您可以通过将其定义为表达式树来避免这种情况:

Expression<Func<User, UserModel>> UserModelSelector = 
m => new UserModel
{
Id = m.Id,
DisplayName = m.DisplayName,
PostCount = m.Posts.Count(),
};

这允许 LINQ 将整个投影转换为 SQL 并将其作为单个查询执行。当然,在表达式树中,您只能使用可以转换为 SQL 的结构,但在这种情况下,一切都很好,正如我们从您的初始方法中看到和知道的那样。

关于c# - 使用 Func<TModel, TResult> 而不是内联选择器时的 Linq2SQL n+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936866/

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