| Вторник, 12 февраля, 2013
Метки: Entity Framework, LINQ Комментарии: 0
Платформа Entity Framework 5 принесла с собой немало улучшений и усовершенствований и скорость производительности запросов одно из них. В данной статье мы расскажем об этапах улучшения производительности запросов в EF, так чтобы было более понятнее как это работает.
//метод с обычным запросом private static void NormalQuery() { using (DataClasses1DataContext db = new DataClasses1DataContext()) { var myNormalQuery = from i in db.Customers select i.Country; foreach (var i in myNormalQuery) { Console.WriteLine(i); } } }
И вызов этой функции сделаем такой:
Stopwatch sw = new Stopwatch(); sw.Start(); NormalQuery(); Console.WriteLine("Затраченное время в миллисекундах: {0}", sw.ElapsedMilliseconds); sw.Stop();
Результат и потраченное время в миллисекундах:
Германия Мексика Мексика Великобритания ::::::::: Затраченное время в миллисекундах : 190
Итак, время потраченное на выполнение обычного запроса составило 190 миллисекунд. Теперь продолжим и выполним компилированный запрос.
Создадим метод с компилированным запросом и посчитаем таймером время его выполнения.
//метод с компилированным запросом private static void CompiledQueryEF() { using (DataClasses1DataContext db = new DataClasses1DataContext()) { var cq = myCompiledQuery(db); foreach (var k in cq) { Console.WriteLine(k); } } } //компилированный запрос private static readonly Func> myCompiledQuery = CompiledQuery.Compile >( (db) => from i in db.Customers select i.Country);
Вызов с таймером:
Stopwatch sw1 = new Stopwatch(); sw1.Start(); CompiledQueryEF(); Console.WriteLine("Затраченное время в миллисекундах: {0}", sw1.ElapsedMilliseconds); sw1.Stop();
Результат и посчитанное время:
Германия Мексика Мексика Великобритания ::::::::: Затраченное время в миллисекундах : 30
Значительное уменьшение времени выполнения компилированного запроса налицо, для получения тех же данных понадобилось 30 миллисекунд.
Используя EF5 уже не надо делать выбор, какой запрос использовать обычный или компилированный. И нет необходимости явно создавать объекты CompiledQuery в коде, чтобы получить преимущество предварительной компиляции запроса.
В EF5 появились автокомпилированые запросы, однако они работают, не так как CompiledQuery. Вместо написания кода, который компилирует каждый запрос, и затем вызывает его по мере необходимости, Entity Framework кеширует сгенерированный SQL в фоновом процессе. И когда выполняется LINQ, то EF находит в кеше уже скомпилированный запрос SQL и использует его по назначению.
Copyright © CodeHint.ru 2013-2024 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля