[英]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.