我创建了一个新的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查询?
由于
答案 0 :(得分:0)
如果我没记错的话,Web Api中的OData管道有时会创建查询并期望NHibernate不允许的内容,甚至NHibernate Linq提供程序都不支持/理解。
因此,仅启用查询支持并不足以让您的NHibernate驱动的API控制器正常工作......
也许这个nuget可以帮助你让你的东西运行: https://github.com/pvginkel/NHibernate.OData
或尝试谷歌搜索一些博客,你会发现至少有一些关于...的讨论...... 否则,如果这太多了,只需使用实体框架......整个asp.net odata实现是为实体框架完成的;)