我正在使用 ObjectSet 的方法在表中执行各种查询,即从表中选择一些记录:
var results = Repository.Find(c => c.Enabled == 1).ToList();
这是我的存储库的 Find 方法:
public IEnumerable<T> Find(Func<T, bool> predicate)
{
try
{
return _objectSet.Where<T>(predicate);
}
catch
{
throw;
}
}
现在,如果目标表中有大约 1,000,000 条记录,我可以看到进程的内存使用量增长了很多,即使我正在执行的 Find 调用最多应该返回几条记录.
似乎所有记录都是从客户端拉取,然后过滤的。这显然不是我希望 LINQ 做的。
您是否发现我所做的有任何明显的错误?
提前致谢。
最佳答案
我认为你应该使用 Expression<Func<T, bool>>
而不是普通的 Func<T, bool>
:
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) {
// your code
}
Where
重载(参见 ObjectSet Class ),并且 Func<T>
-过载由 IEnumerable<T>
定义,而 Expression<TDelegate>
被 IQueryable<T>
使用.因为predicate
是 Func<T>
编译器调用为 IEnumerable<T>
定义的扩展方法,然后获取所有记录并对对象执行 LINQ。
关于c# - ObjectSet的Where()方法和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775476/