WebAPI + IQueryable中的System.ArgumentOutOfRangeException

时间:2014-10-16 20:03:34

标签: c# asp.net-mvc-4 nhibernate asp.net-web-api

我创建了一个新的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 }
    );
}

这是我的IQueryable。我使用Repository模式使用NHibernate检索数据。

public class TradeViewController : ApiController
{
    public IQueryable<TradeView> Get()
    {
        return new TradeViewRepository().GetQueryable();
    }
}

当我尝试测试控制器时,我得到以下异常

  
    

System.ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。     参数名称:index

  

这是我的测试

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

由于

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,Web Api中的OData管道有时会创建查询并期望NHibernate不允许的内容,甚至NHibernate Linq提供程序都不支持/理解。

因此,仅启用查询支持并不足以让您的NHibernate驱动的API控制器正常工作......

也许这个nuget可以帮助你让你的东西运行: https://github.com/pvginkel/NHibernate.OData

或尝试谷歌搜索一些博客,你会发现至少有一些关于...的讨论...... 否则,如果这太多了,只需使用实体框架......整个asp.net odata实现是为实体框架完成的;)