EF中的Take扩展方法在我的记忆中有多少个对象?

时间:2011-08-24 10:42:22

标签: c# entity-framework c#-4.0 entity-framework-4

我使用的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 个答案:

答案 0 :(得分:2)

您的Get方法会导致执行查询(您在方法结束时使用ToList())。这导致了很大的不同:

  • 您的第一个查询在数据库中查找ID为&lt; = 5的所有行,并仅将这些行显示为实体。所以你得到最多。内存中的5个对象(假设你的最小id是1)。

  • 您的第二个查询根本没有在SQL中应用的过滤器。所以它按id递减整个表,然后返回完整的表,并且表中的行中的对象将在内存中实现。在这个内存中集合中,你应用Take(5)(LINQ to Objects,而不是LINQ to Entities),这意味着你会抛弃除前五个之外的所有对象。

第二个查询不好。 Take(5)应在IQueryable方法的Get内执行,以确保前5行的选择实际发生在数据库中,并且只有5个对象在内存中创建。