System.ArgumentOutOfRangeException in WebAPI + IQueryable
本文关键字:IQueryable WebAPI in ArgumentOutOfRangeException System | 更新日期: 2023-09-27 18:26:52
我创建了一个新的MVC4 web api项目,以通过HTTP公开实体。由于我希望查询是针对数据库而不是在内存中执行的,所以我启用了查询支持
public static void Register(HttpConfiguration config)
{
config.EnableQuerySupport();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
这是我的智商。我正在使用Repository模式来使用NHibernate检索数据。
public class TradeViewController : ApiController
{
public IQueryable<TradeView> Get()
{
return new TradeViewRepository().GetQueryable();
}
}
当我尝试测试控制器时,我得到以下异常
System.ArgumentOutOfRangeException:索引超出范围。必须是非负数并且小于集合的大小。参数名称:索引
这是我的测试
public void Get()
{
TradeViewController controller = new TradeViewController();
// Act
var result = controller.Get();
var count = result.Take<TradeView>(10).Count();
Assert.AreEqual(10, count);
}
一般来说,是否可以对WebAPI中的控制器使用LINQ查询?
感谢
如果我没记错的话,WebApi中的OData管道有时确实会创建查询,并期望得到NHibernate不允许的东西,甚至NHibernateLinq提供程序也不支持/理解。
因此,仅仅启用查询支持是不足以让NHibernate驱动的API控制器工作的。。。
也许这个裸体可以帮助你让你的东西运转起来:https://github.com/pvginkel/NHibernate.OData
或者试着在谷歌上搜索一些博客,你会发现至少有一些关于这方面的讨论。。。否则,如果这一切都太多了,只需使用实体框架。。。整个asp.net odata的实现是针对实体框架完成的;)