1

我正在使用 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 做的。

你觉得我在做什么明显有问题吗?

提前致谢。

4

1 回答 1

2

我认为你应该使用Expression<Func<T, bool>>而不是简单的Func<T, bool>

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) {
  // your code
}

Where被重载(参见ObjectSet 类),并且Func<T>-overload 由 定义IEnumerable<T>,而Expression<TDelegate>IQueryable<T>. 因为predicate是 a Func<T>,编译器调用为 定义的扩展方法IEnumerable<T>,进而获取所有记录并对对象执行 LINQ。

于 2013-02-08T15:10:43.090 回答