Stored procedures 实体框架4-调用选择/分页存储过程

Stored procedures 实体框架4-调用选择/分页存储过程,stored-procedures,asp.net-mvc-2,paging,entity-framework-4,Stored Procedures,Asp.net Mvc 2,Paging,Entity Framework 4,我刚从EntityFramework4.0和ASP.NETMVC2开始,对存储过程和分页的使用有一些疑问 您可以将插入、更新和删除操作映射到存储过程,我已经这样做了。但是,为了使分页工作,我需要映射Select操作 现在是唯一/最好的方法,方法是转到我的模型浏览器,右键单击存储过程并“添加函数导入”并添加它 这将导致以下代码 var contactFormSubmissions = _entities.ContactFormSubmission_GetContactFormSubmissions

我刚从EntityFramework4.0和ASP.NETMVC2开始,对存储过程和分页的使用有一些疑问

您可以将插入、更新和删除操作映射到存储过程,我已经这样做了。但是,为了使分页工作,我需要映射Select操作

现在是唯一/最好的方法,方法是转到我的模型浏览器,右键单击存储过程并“添加函数导入”并添加它

这将导致以下代码

var contactFormSubmissions = _entities.ContactFormSubmission_GetContactFormSubmissions(1, 10);
我的问题是,它将其添加到根级别的全局实体容器中,而不是像插入/更新和删除操作这样的ContactFormSubmission实体

我宁愿这样,但通过一个存储过程

_entities.ContactFormSubmissions.Select<ContactFormSubmission>(string.Empty, pageParam, pageSizeParam);
\实体。ContactFormSubmissions。选择(string.Empty、pageParam、pageSizeParam);
通过这种方式,select的调用方式与其他操作的调用方式相同,并且我不会在实体容器的根中使用很多函数,这些函数可能会变得不可管理

这是一个较小的问题,至少目前它的所有工作

我的下一个问题是如何使用此函数最好地实现分页

我看到的所有关于如何使用MVC和实体框架实现分页的示例都使用了LINQ和IQueryable。有没有一种方法可以将IQueryable与延迟加载一起使用,将LINQ函数Skip/Take与基于表的函数/sproc一起使用


PS-任何使用SP的实体框架在MVC中进行分页的示例都将非常棒

LINQ开箱即用不会包装存储过程。实体框架函数是通过EF调用存储过程并返回实体的唯一方法。这是可以理解的,因为EF也知道映射分页变量的参数

您永远不会/不应该这样做,但我觉得有必要(因为没有什么是不可能的)说您可以为您的过程编写LINQ的自定义实现,但是要干净地包装两个过程,这将是一个堆积如山的工作

一些建议:

  • 您可以只使用linq并跳过存储过程
  • 如果您继续使用EF通过函数包装存储过程,则可以通过将模型分解为多个上下文来缓解多个函数的问题
  • 可以使用EF上下文的connection属性直接调用存储过程,并使用只读(非EF附加)viewmodel类进行显示。id(或其他主键)字段仍然是正确的值,可以让您进入详细信息屏幕或json回调,以获得真实EF对象的可编辑版本
这些都不是十全十美的,但有很多方法可以解决这个问题