0

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

3 回答 3

2

的,所有数据都将首先在内存中获取,然后在客户端进行过滤。将存储过程与 EF 一起使用不是一个好主意。您将在这里失去延迟、急切或显式加载的优势。但是,如果您让 EF 为您生成查询,那么它将编译所有过滤器并在服务器上执行

于 2013-08-15T16:01:44.073 回答
1

作为替代方案,您可能需要考虑创建表值函数而不是存储过程。这里的优点是函数的结果集可以与服务器端的其他表连接。缺点是您可以在函数内部执行的操作受到限制,并且数据库无法访问您可以使用索引视图访问的函数结果的索引。

在http://blogs.msdn.com/b/efdesign/archive/2011/01/21/table-valued-function-support.aspx上查看有关将 TVS 与 EF 结合使用的更多信息

于 2013-08-15T17:42:19.147 回答
0

Sprocs 将始终返回受与其关联的查询影响的所有记录。如果要添加 where 子句,只需在 sproc 中添加一个参数并在 sql 中执行过滤。检查此以获取更多信息如何将参数从实体框架传递给存储过程?

于 2013-08-15T16:08:43.443 回答