对象集';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做的。

你觉得我做的事情有什么明显的问题吗?

提前谢谢。

对象集';s Where()方法和内存

我认为应该使用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>使用。因为predicateFunc<T>,所以编译器调用为IEnumerable<T>定义的扩展方法,该方法依次获取所有记录并对对象执行LINQ。