asp.net - 如何诊断缓慢的实体框架存储过程调用?
问题描述
问题:我正在通过 EF Core 调用存储过程。当我直接运行存储过程(通过“调试过程”)时,它运行得很快,但是当被 EF 调用时,它运行得非常FromSqlRaw
慢。所以问题似乎出在将返回的数据表转换为对象列表时。
设置:
- 带有博客文章列表的简单应用程序。存储过程从 TPH 帖子表和用户表中获取帖子和关联用户的分层列表。
// Code is simplified, actually 8 parameters
SqlParameter depth_p = new SqlParameter("@depth", depth);
SqlParameter authorizedUserID_p = new SqlParameter("@authorizedUserID", authorizedUser.ID);
IQueryable<PostUser> query = postContext.PostUsers
.FromSqlRaw("Post.USP_ReadDebate @depth, @authorizedUserID",
parameters: new[] { depth_p, authorizedUserID_p });
List<PostUser> postUsers = query.ToList(); // This hangs.
EF 返回 26 列并将其转换为
PostUser
类。PostUser
拥有 26 个“普通”属性。没有导航属性、自定义类或任何做任何工作的 getter 或 setter。
public class PostUser
{
// Post fields
public Int32? ID { get; set; } // Primary Key
public String Text { get; set; }
public Guid OwnerID { get; set; }
public int? ParentID { get; set; } // nullable
public bool IsDisabled { get; set; }
public DateTime TimeCreated { get; set; }
public bool User_IsBanned { get; set; } = false;
// some others...
public PostUser() { }
}
注意:存储过程非常复杂。它调用另一个填充
@spid
表的存储过程,然后将该@SPID
表的内容插入到表变量中并返回。
但是再次直接调试时它会快速返回,所以我认为问题在于 EF Core 将返回的数据转换为PostUser
对象时。底线:有什么方法可以了解 EF Core 在转换中所做的工作
PostUser
以找到问题?
谢谢!
解决方案
推荐阅读
- javascript - 为什么 webpacker 编译包的顺序没有维护?所以函数没有定义
- c# - 用户输入并显示错误消息时如何验证文本框值?
- vb.net - 二维for循环出错了
- python - 如何存储从while循环中随机生成的二维列表?
- tree - 如何获取这棵树中的叶子列表?OCaml 中的问题
- dynamic-programming - 有界背包问题的时间复杂度
- python - 元组比较在有和没有显式括号的情况下给出不同的结果
- angular - 在 Angular 中订阅和更新 URL 查询变量的正确方法?
- c - 如何使用蜂窝设备在 Zephyr OS 上实现 MQTT?
- patch - 为什么这个 mercurial 补丁不移动文件?