c# - ObjectSet的Where()方法和内存

标签 c# database memory-management entity-framework-4 objectset

我正在使用 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> 使用.因为predicateFunc<T>编译器调用为 IEnumerable<T> 定义的扩展方法,然后获取所有记录并对对象执行 LINQ。

关于c# - ObjectSet的Where()方法和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775476/

相关文章:

arrays - malloc 接触未分配的内存

Java 垃圾收集器逻辑查询

C:没有显式返回构造的结构,但它仍然有效

java - 使用 C# 检测特定程序何时关闭

c# - 如何在 Splitcontainer panel2 c# 中显示级联窗口

c# - 查询变量中的 EF 双斜杠参数未给出任何结果

database - 如何为单个主键插入多行?

database - oracle 中的隔离级别

Android 无法从 Assets 复制数据库

c# - 如何将 C#.net 字典传递给 VBA