【问题标题】:.Where Lambda expression loading entire table.Where Lambda 表达式加载整个表
【发布时间】:2013-04-29 20:42:29
【问题描述】:

我已经使用代码优先方法建立了一个实体框架项目: Link to code-first approach

我添加了一个通过插入函数来访问存储库的方法:

仓库接口:

IQueryable<T> GetMany(Func<T, bool> where);

EntityRepositoryBase 方法:

public virtual IQueryable<T> GetMany(Func<T, bool> where)
{
     return dbset.Where(where).AsQueryable();
}

我如何访问它的示例:

genericRepositoryName.GetStuffInHere(x => x.Name== "Billy");

但是,执行此操作时,它会加载整个表并过滤数据。正如您可以想象的那样,这需要很长时间。我有一个使用 .Find() 的 ByID 方法,它正确执行查询并以毫秒为单位获取记录。我完全不知道为什么会发生这种情况——或者我做错了什么。有没有更好的方法来获取一个字段的所有记录,比如说,包含一串“Hello”。当前进程取回记录大约需要 5-10 秒。

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework lambda


    【解决方案1】:

    猜测...

    使用 linq,要将其转换为 sql 查询,必须给它一个表达式树,然后它可以将其转换为 sql。我认为你的 Func 搞砸了

    试试dbset.Where(x -&gt; x.Name=="Billy);

    或者正如 Kirk 在 cmets 中指出的那样,更改为表达式树:

    public virtual IQueryable<T> GetMany(Expression<Func<T, bool>> where)
    

    【讨论】:

    • 对,或者把Func&lt;T, bool&gt;改成Expression&lt;Func&lt;T, bool&gt;&gt;
    • 一旦你这样做了,你也可以摆脱AsQueryable。您需要它开始的事实应该暗示您使用的是 Where 的 IEnumerable 重载,而不是 IQueryable 版本。
    【解决方案2】:

    如果我不得不猜测,dbset 不是IQueryable&lt;T&gt;DbSet。这可能是IEnumerable&lt;T&gt; 的某种方式,它导致整个表在 C# 而不是 SQL 中被提取和过滤。

    我会确保您不会通过调用ToList() 或通过foreach 循环将数据库集更改为任何地方的可枚举。

    【讨论】:

    • 好的,谢谢!明天我回去工作时会运行我的代码!
    • 不确定 - 不是我。我通过检查.. 找到了一个 codeToList()code 但它仍然没有工作。今天去研究另一个答案,看看它是否有帮助!不幸的是,我不能投票给他:(。
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多