将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,
-
将
[Queryable]
属性放在您的操作上。 您的操作可以返回其中一个 –IEnumerable
,IQueryable
,HttpResponseMessage
,内容为ObjectContent
或> ObjectContent
,> Task
,> Task
,> Task
具有与之前相同的限制。 -
通过执行
configuration.EnableQuerySupport()
启用全局查询。 这将启用查询返回IQueryable
所有方法。 -
使用此处提到的
ODataQueryOptions
并自己手动应用查询。
关于DbContext
处理问题,我们以一种懒惰的方式很晚地评估查询 – 当格式化程序将响应写入流时。 所以,你不应该在你的行动中处理DbContext
。 而是将它与控制器一起处理,即覆盖控制器的Dispose
方法并将其丢弃。 Web API负责控制器的生命周期,并在请求完成处理后处理控制器。 此外,您也可以使用Request.RegisterForDispose
方法,在请求完成处理时配置任何资源。
上述就是C#学习教程:将OData Queryable与存储库一起使用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1014883.html