首页 > 解决方案 > 如何诊断缓慢的实体框架存储过程调用?

问题描述

问题:我正在通过 EF Core 调用存储过程。当我直接运行存储过程(通过“调试过程”)时,它运行得很快,但是当被 EF 调用时,它运行得非常FromSqlRaw慢。所以问题似乎出在将返回的数据表转换为对象列表时。

设置:

  1. 带有博客文章列表的简单应用程序。存储过程从 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.
  1. EF 返回 26 列并将其转换为PostUser类。

  2. 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() { }
}
  1. 注意:存储过程非常复杂。它调用另一个填充@spid表的存储过程,然后将该@SPID表的内容插入到表变量中并返回。
    但是再次直接调试时它会快速返回,所以我认为问题在于 EF Core 将返回的数据转换为PostUser对象时。

  2. 底线:有什么方法可以了解 EF Core 在转换中所做的工作PostUser以找到问题?

谢谢!

标签: asp.netentity-frameworkentity-framework-core

解决方案


推荐阅读