Mysql 在创建对象时减少对数据库的调用次数?

Mysql 在创建对象时减少对数据库的调用次数?,mysql,asp.net-mvc,entity-framework,Mysql,Asp.net Mvc,Entity Framework,所以,我不是sql的新手,但我还在学习。情况是,我有以下代码: Thread thread = context.Threads .Where(t => t.ThreadId == id) .Include(p => p.Posts) .FirstOrDefault(); if (thread != null) { foreach

所以,我不是sql的新手,但我还在学习。情况是,我有以下代码:

Thread thread = context.Threads
                .Where(t => t.ThreadId == id)
                .Include(p => p.Posts)
                .FirstOrDefault();

            if (thread != null) {

                foreach (var item in thread.Posts) {
                    UserProfile profile = new UserProfile();
                    profile.UserId = item.CreatedBy;
                    profile.UserName = userManager.FindById(profile.UserId).UserName;
                    item.UserProfile = profile;
                }
            }
我的代码工作没有问题,它将所有相关的帖子获取到线程中,但是一个有50篇帖子的线程将进行50次查询来创建一个用户配置文件,这看起来效率非常低。我是否可以对此进行改进,以减少查询,并为每篇文章创建一个用户配置文件


如果这有什么不同,我已经禁用了延迟加载。

我想感谢大家的快速回答!他们为我提供了一些关于如何处理数据库查询的好知识。 根据@Raymond和@Panagiotis insights,我将UserProfile类映射到一个存储用户id和名称的表中。此外,我还向Post类添加了一个UserProfile

然后将我的查询更改为以下内容并删除foreach循环:

Thread thread = context.Threads
                .Include(p => p.Posts)
                .Include(p => p.Posts.Select(e => e.UserProfile))
                .Where(t => t.ThreadId == id)
                .FirstOrDefault();

然后它查询UserProfile并将其映射到Post.UserProfile,并将N个调用减少为1。耶

@RaymondNijland不,他们没有。这就是可怕的N+1问题。解决方案是不要进行50次查询,例如使用
FindById
@Gixen不要进行50次查询-不要使用
FindById
。ORM通过映射关系来工作-Post和用户之间应该存在关系,例如
Post.User
属性。这将允许ORM生成SQL查询,该查询将加载用户名和posts@PanagiotisKanavos你对我的解释完全错了。。我真的需要一些咖啡刚刚醒来。@Gixen一篇文章的作者可能与登录用户是同一个人,但这并不意味着您需要从身份验证系统加载用户名。您不必从身份验证提供程序加载用户名。如果你用谷歌怎么办?此外,帖子的作者多久会更换一次?登录名多久更改一次?在创建
Post
实例时,您可能应该将
author
存储为一个单独的字符串属性。“ORM通过映射关系工作-Post和用户之间应该有一个关系,例如Post.User属性。这将允许ORM生成SQL查询,该查询将加载用户名和Post”是的,有些ORM生成多个(无连接选择)SQL查询来映射关系,有些ORM生成正确的JOIN语句来映射关系,具体取决于ORM的编程方式或设置,如lazy loading@PanagiotisKanavos这是我在第一条(已删除)注释中试图告诉大家的。。