Обычные, компилированные, и автокомпилированные запросы LINQ в Entity Framework 5

| Вторник, 12 февраля, 2013

Метки: Entity Framework, LINQ Комментарии: 0

Платформа Entity Framework 5 принесла с собой немало улучшений и усовершенствований и скорость производительности запросов одно из них. В данной статье мы расскажем об этапах улучшения производительности запросов в EF, так чтобы было более понятнее как это работает.

Обычные запросы LINQ

//метод с обычным запросом
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 миллисекунд. Теперь продолжим и выполним компилированный запрос.

Компилированные запросы LINQ

Создадим метод с компилированным запросом и посчитаем таймером время его выполнения.

//метод с компилированным запросом
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 миллисекунд.

Автокомпилированные запросы LINQ

Используя EF5 уже не надо делать выбор, какой запрос использовать обычный или компилированный. И нет необходимости явно создавать объекты CompiledQuery в коде, чтобы получить преимущество предварительной компиляции запроса.

В EF5 появились автокомпилированые запросы, однако они работают, не так как CompiledQuery. Вместо написания кода, который компилирует каждый запрос, и затем вызывает его по мере необходимости, Entity Framework кеширует сгенерированный SQL в фоновом процессе. И когда выполняется LINQ, то EF находит в кеше уже скомпилированный запрос SQL и использует его по назначению.

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019