簡體   English   中英

如何從oData V4 API操作返回IQueryable

[英]How to return IQueryable from an oData V4 api action

按照此處的教程操作我嘗試返回IQueryable,但出現錯誤由於DbContext已被處理,因此操作無法完成

public class ProductsController : ODataController
{
    [EnableQuery]
    public IQueryable<Product> Get()
    {
        return GetRepository<Product>().GetQueryable();
    }
}

GetRepository()是較大的通用DI和工作單元模式類的一部分,該類基本上

public Repository(DbContext context)
{
    Context = context;
    DbSet = Context.Set<T>();
}

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

    return query;
}

如果仔細查看示例(在提供的鏈接中提供),您會發現它們的上下文不在響應方法之內,並且直到在控制器上調用Dispose方法后,該上下文才會被處理。

    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進行申請。

從控制器返回IQueryable時,您無法控制該IQueryable的運行時間。 發生的情況是,在Web API管道開始運行IQueryable並返回結果之前,已經處置了DbContext。

您對GetRepository所做的工作稱為服務定位器模式。 但是,Web API具有執行依賴關系注入的機制,這將使您對資源的生存期更具確定性。

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

使用這種方法,構造函數將注入服務(GetRepository的返回類型),然后在控制器上重寫Dispose,以便清理構造函數注入的服務。 一旦完成運行並從IQueryable返回結果,Web API就會在您的控制器上調用Dispose,因此可以解決您的生命周期問題。

NuGet上有許多通用IOC容器的包裝,以允許它們自動與Web API一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM