。Lambda表达式加载整个表

时间:2013-04-29 20:42:29

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

我已经使用代码优先方法设置了一个实体框架项目: 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秒才能恢复记录。

2 个答案:

答案 0 :(得分:6)

猜测......

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

只试试dbset.Where(x -> x.Name=="Billy);

或正如Kirk在评论中指出的那样,改为表达式树:

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

答案 1 :(得分:1)

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

我确保您不会通过调用ToList()或通过foreach循环将dbset更改为可枚举的任何内容。