C# 具有多个结果集的存储过程非常慢

C# 具有多个结果集的存储过程非常慢,c#,sql-server,performance,entity-framework,stored-procedures,C#,Sql Server,Performance,Entity Framework,Stored Procedures,我将EF6与ObjectContext+edmx模型一起使用。存在一个具有多个结果集的存储过程。事实证明,每次我们调用.GetNextResult时,它都会动态编译新方法,造成巨大的开销和性能损失。我使用Perfview和JIT编译统计数据来解决这个问题 using (var db = new SomeEntities()) { var resultSet1 = db.GetAllData(); // handle result set 1 data // Thi

我将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>(); 
}
使用(var db=new SomeEntities())
{ 
var resultSet1=db.GetAllData();
//处理结果集1数据
//这将导致JIT编译新的动态发出的方法。
var resultSet2=resultSet1.GetNextResult();
}
有没有办法消除动态编译并仍然使用.GetNextResult?
到目前为止,我不得不回到旧的ADO.net数据读取器,如中所示。我发现的解决方案比.GetNextResult快得多,同时与ADO.net数据读取器相比,它的“手动”更少。 是的。翻译方法。有一个描述如何使用它的例子。基本上

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);
var cmd=db.Database.Connection.CreateCommand();
cmd.CommandText=“[dbo].[GetAllBlogsAndPosts]”;
db.Database.Connection.Open();
var reader=cmd.ExecuteReader();
//读取第一个结果集
var blogs=((IObjectContextAdapter)db.ObjectContext.Translate(读取器,“blogs”,MergeOption.AppendOnly);
//读取第二个结果集
reader.NextResult();
var posts=((IObjectContextAdapter)db.ObjectContext.Translate(读取器,“posts”,MergeOption.AppendOnly);
我写了更多关于这个和示例应用程序的细节