Сколько объектов в моей памяти с методом расширения Take в EF? - PullRequest
0 голосов
/ 24 августа 2011

Я использую GenericRepository, который имеет метод Get:

Я хотел бы знать, есть ли разница в загрузке между следующими кусками кода:

Expression<Func<PressRelease_ar, bool>> exp = p => p.Id <=5 ; 
lst = Global.uow.PressReleaseRepository_ar
      .Get
      (
         filter : exp, 
         orderBy: n => n.OrderByDescending(d => d.Id)
       ).ToList();

И

 lst = Global.uow.PressReleaseRepository_ar
          .Get
          (
             orderBy: n => n.OrderByDescending(d => d.Id)
          ).Take(5).ToList();

Для более подробной информации, это метод Get:

    public virtual IEnumerable<TEntity> Get(
                                 Expression<Func<TEntity, bool>> filter = null,
                                 Func<IQueryable<TEntity>,
                                 IOrderedQueryable<TEntity>> orderBy = null,
                                 string includeProperties = "")
   {

      IQueryable<TEntity> query = dbSet;

      if (filter != null) query = query.Where(filter);

      foreach (var includeProperty in includeProperties.Split
                 (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
      {
          query = query.Include(includeProperty);
      }


      if (orderBy != null) return orderBy(query).ToList();
      else return query.ToList();
    }

1 Ответ

2 голосов
/ 24 августа 2011

Ваш метод Get вызывает выполнение запроса (вы используете ToList() в конце метода).Это приводит к большой разнице:

  • Ваш первый запрос ищет в базе данных все строки с идентификатором <= 5 и материализует только эти строки как сущности.Таким образом, вы получите макс.5 объектов в памяти (учитывая, что ваш наименьший идентификатор равен 1). </p>

  • Ваш второй запрос вообще не имеет фильтра, который применяется в SQL.Таким образом, она сортирует всю таблицу по убыванию по id, а затем возвращает полную таблицу, и столько объектов, сколько строк в таблице будет материализовано в памяти.К этой коллекции в памяти вы применяете Take(5) (LINQ to Objects, а не LINQ to Entities), что означает, что вы затем отбрасываете все объекты, кроме первых пяти.

Второй запросплохо.Take(5) должен быть выполнен для вашего IQueryable внутри вашего Get метода, чтобы убедиться, что выбор первых 5 строк происходит в действительности в базе данных, и только эти 5 объектов создаются в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...