对象集';s Where()方法和内存
本文关键字:方法 内存 Where 对象 | 更新日期: 2023-09-27 17:58:26
我使用ObjectSet的方法在表中进行各种查询,即从中选择一些记录,例如:
var results = Repository.Find(c => c.Enabled == 1).ToList();
以下是我的存储库的查找方法:
public IEnumerable<T> Find(Func<T, bool> predicate)
{
try
{
return _objectSet.Where<T>(predicate);
}
catch
{
throw;
}
}
现在,如果目标表中大约有1000000条记录,我可以看到进程的内存使用量增长了很多,即使我正在执行的Find调用最多应该返回一些记录。
似乎所有的记录都是从客户端提取的,然后进行过滤。这显然不是我想要LINQ做的。
你觉得我做的事情有什么明显的问题吗?
提前谢谢。
我认为应该使用Expression<Func<T, bool>>
而不是普通的Func<T, bool>
:
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) {
// your code
}
Where
被重载(请参见ObjectSet类),Func<T>
-重载由IEnumerable<T>
定义,而Expression<TDelegate>
由IQueryable<T>
使用。因为predicate
是Func<T>
,所以编译器调用为IEnumerable<T>
定义的扩展方法,该方法依次获取所有记录并对对象执行LINQ。