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查询?

感谢

System.ArgumentOutOfRangeException in WebAPI + IQueryable

如果我没记错的话,WebApi中的OData管道有时确实会创建查询,并期望得到NHibernate不允许的东西,甚至NHibernateLinq提供程序也不支持/理解。

因此,仅仅启用查询支持是不足以让NHibernate驱动的API控制器工作的。。。

也许这个裸体可以帮助你让你的东西运转起来:https://github.com/pvginkel/NHibernate.OData

或者试着在谷歌上搜索一些博客,你会发现至少有一些关于这方面的讨论。。。否则,如果这一切都太多了,只需使用实体框架。。。整个asp.net odata的实现是针对实体框架完成的;)