[英]Stored procedure with multiple result sets very slow
我将EF6与ObjectContext + edmx模型一起使用。 有一个具有多个结果集的存储过程。 事实证明,每次调用.GetNextResult时,它都会动态编译新方法,从而产生巨大的开销和性能损失。 我使用Perfview和JIT编译统计数据来弄清楚这一点。
using (var db = new SomeEntities())
{
var resultSet1 = db.GetAllData();
// handle result set 1 data
// This causes new dynamically emitted method to be JIT-compiled.
var resultSet2 = resultSet1.GetNextResult<Class2>();
}
是否有消除动态编译并仍然使用.GetNextResult的方法? 到目前为止,我必须还原到旧的ADO.net数据阅读器,如MSDN中所示
我发现解决方案比.GetNextResult更快,并且与ADO.Net DataReader相比,“手动”解决方案更少。 这是.Translate方法。 有MSDN文章描述了如何使用它。 基本上
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]";
db.Database.Connection.Open();
var reader = cmd.ExecuteReader();
// Read first result set
var blogs = ((IObjectContextAdapter)db).ObjectContext.Translate<EFStoredProcJit.Blog>(reader, "Blogs", MergeOption.AppendOnly);
// Read 2nd result set
reader.NextResult();
var posts = ((IObjectContextAdapter)db).ObjectContext.Translate<EFStoredProcJit.Post>(reader, "Posts", MergeOption.AppendOnly);
我写了博客文章,其中包含有关此示例应用程序的更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.