鉴于下面的EF linq,存储过程usp_GetTestRecords()中的所有记录是否会遇到然后被过滤?
TestRecordsDBEntities dataContext = new TestRecordsDBEntities();
var tests = dataContext.usp_GetTestRecords();
var filtered = tests.Where(x => x.GroupId == groupId)
.OrderByDescending(y => y.Name)
.ToList();
答案 0 :(得分:2)
是所有数据将首先在内存中获取,然后在客户端进行过滤。使用EF存储过程不是一个好主意。你将失去懒惰,渴望或显式加载的优势。但是,如果您让EF为您生成查询,那么它将被编译为所有过滤器并在服务器上执行
答案 1 :(得分:1)
作为替代方案,您可能需要考虑创建table value function而不是存储过程。这里的优点是函数的结果集可以与服务器端的其他表连接。缺点是您在函数内部可以执行的操作方面受到限制,并且数据库无法访问索引视图所具有的函数结果的索引。
在http://blogs.msdn.com/b/efdesign/archive/2011/01/21/table-valued-function-support.aspx
了解有关在EF中使用TVS的更多信息答案 2 :(得分:0)
Sprocs将始终返回受与之关联的te查询影响的所有记录。如果你想添加一个where子句,只需在你的sproc中添加一个param并在sql中执行过滤。有关详细信息,请查看此How to pass Parameters to Stored Procedure from Entity Framework?