首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从IQueryable oData V4 api操作返回V4

如何从IQueryable oData V4 api操作返回V4
EN

Stack Overflow用户
提问于 2016-11-01 12:50:03
回答 2查看 2.1K关注 0票数 1

在教程这里之后,我试图返回IQueryable,但是我得到了错误,操作无法完成,因为DbContext已被释放

代码语言:javascript
复制
public class ProductsController : ODataController
{
    [EnableQuery]
    public IQueryable<Product> Get()
    {
        return GetRepository<Product>().GetQueryable();
    }
}

GetRepository()是一个更大的泛型DI和工作模式单元类的一部分,基本上

代码语言:javascript
复制
public Repository(DbContext context)
{
    Context = context;
    DbSet = Context.Set<T>();
}

public virtual IQueryable<T> GetQueryable()
{
    IQueryable<T> query = DbSet;

    return query;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-01 13:19:47

当您从控制器返回IQueryable时,您无法控制运行该IQueryable的时间。正在发生的情况是,在Web管道开始运行IQueryable并返回结果之前,您的IQueryable正在被释放。

您使用GetRepository所做的工作称为服务定位器模式。然而,Web有一种执行依赖注入的机制,这将使您对资源的生存期具有更多的确定性控制。

https://www.asp.net/web-api/overview/advanced/dependency-injection

使用这种方法,构造函数注入服务(GetRepository的返回类型),然后覆盖控制器上的Dispose,以便清理注入的构造函数。一旦控制器运行完毕并返回来自IQueryable的结果,Web将在控制器上调用Dispose,因此您的生存期问题将得到解决。

对于许多常用的IOC容器,NuGet上都有包装器,使它们能够自动地使用Web。

票数 3
EN

Stack Overflow用户

发布于 2016-11-01 13:05:02

如果仔细查看所提供的链接中给出的示例,可以看到它们在响应方法之外具有上下文,并且在控制器上调用Dispose方法之前不会对其进行处理。

代码语言:javascript
复制
    public class ProductsController : ODataController
        {
            ProductsContext db = new ProductsContext();

            [EnableQuery]
            public IQueryable<Product> Get()
            {
               return db.Products;
            }         

            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }

最有可能的是,您将在GetRepository()或GetQueryable()方法中释放创建的上下文。例如,通过应用using

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40360419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档