| Вторник, 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-2025 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля