我使用的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();
}
答案 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个对象在内存中创建。