2

我已经使用代码优先方法建立了一个实体框架项目: 链接到代码优先方法

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

仓库接口:

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 秒才能取回记录。

4

2 回答 2

6

估计...

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

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

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

public virtual IQueryable<T> GetMany(Expression<Func<T, bool>> where)
于 2013-04-29T20:49:18.980 回答
1

如果我不得不猜测,dbsetis notIQueryable<T>或 a DbSet。这可能是某种方式IEnumerable<T>,导致整个表在 C# 中而不是 SQL 中被获取和过滤。

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

于 2013-04-29T20:49:07.477 回答