0

Я использую 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

ответ

0

я нашел решение, которое работает гораздо быстрее, чем .GetNextResult и в то же время менее «руководство» по сравнению с ADO.Net DataReader. Это .Translate метод. Существует MSDN article, описывающий, как его использовать. В основном

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); 

Я написал blog post более подробную информацию об этом и пример приложения.

Смежные вопросы