将OData Queryable与存储库一起使用?

我有这个存储库方法:

public IQueryable GetAll() { using (var context = new DatabaseContext()) { return context.Set().AsQueryable(); } } 

无论如何, TModel是一个艺术家模型

然后我在我的控制器中执行此操作:

 // GET api/artist [Queryable] public IQueryable Get() { return _repo.GetAll().AsQueryable(); } 

现在..如果我要更改存储库方法以返回List并为我的结果添加.ToList ..那么这将很有效。 但是无论OData查询是什么,我都会首先执行“获取所有查询”…将它们转换为列表,然后我将针对该列表执行我的OData查询。

这似乎是完全错误的..我想要做的是确保OData查询在我尝试从数据库中获取数据的同时执行..所以我只得到与查询匹配的非常具体的结果..而不是后来被查询的大量数据..

现在我有问题, DbContext在使用之外被处理掉了..但是我仍然需要关闭DbContext以及一些地方,一些如何…

有任何想法吗?

web api的可查询扩展的最新版本有点令人困惑,因为它与以前的版本有很大的不同。 在新版本中,您需要显式启用可查询支持或使用新的查询选项类。 看到这个

编辑:有些代码,因为我现在在办公桌前

 public IQueryable GetAll(ODataQueryOptions opts) { var db = _repo.GetAll(); return (IQueryable) opts.ApplyTo(db); } 

您可以通过几种方式启用可查询的Web API,

  1. [Queryable]属性放在您的操作上。 您的操作可以返回其中一个 – IEnumerableIQueryableHttpResponseMessage ,内容为ObjectContent>ObjectContent>Task>Task>Task具有与之前相同的限制。

  2. 通过执行configuration.EnableQuerySupport()启用全局查询。 这将启用查询返回IQueryable所有方法。

  3. 使用此处提到的ODataQueryOptions并自己手动应用查询。

关于DbContext处理问题,我们以一种懒惰的方式很晚地评估查询 – 当格式化程序将响应写入流时。 所以,你不应该在你的行动中处理DbContext 。 而是将它与控制器一起处理,即覆盖控制器的Dispose方法并将其丢弃。 Web API负责控制器的生命周期,并在请求完成处理后处理控制器。 此外,您也可以使用Request.RegisterForDispose方法,在请求完成处理时配置任何资源。