linq会从存储过程调用中恢复所有记录,然后过滤吗?

时间:2013-08-15 15:55:59

标签: c# linq entity-framework

鉴于下面的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();

3 个答案:

答案 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?