Asp.net-Web-Api

查詢後修改odata結果

  • February 6, 2018

我有一個使用 Entity Framework 和 Odata 的 ASP.NET Web API 應用程序。

我想在使用 GET 時修改查詢結果…目前,在控制器中,您實際上只需將 EntityFramework 數據實體傳遞回 Odata 處理程序…

[EnableQuery]
public IQueryable<myEntity> GetLineItem()
{
   return db.myEntities;
}

通過簡單地返回一個子集,將任何查詢 Odata 傳遞給它很簡單

return db.myEntity.Where(myEntity => myEntity.Name == "Bob")

Odata 會將 $filter 查詢字元串參數中的任何內容添加到此處傳遞的表達式中,您將獲得這些結果的子集。

但是,一旦查詢執行並將 SQL 結果解析為實體對象,我想對結果進行迭代。

我嘗試創建一個實現 IQueryable 介面並連接到 GetEnumerator 方法的包裝器,對於 IProvider 和連接到執行方法也是如此。Odata 似乎沒有使用其中任何一種。

有沒有辦法做到這一點?

使用 OData 時,您不必從控制器返回 IQuerable。檢查https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options上的“直接呼叫查詢選項”部分 對於您的情況,它看起來像:

public HttpResponseMessage Get(ODataQueryOptions<myEntity> opts)
{
   var settings = new ODataValidationSettings();

   opts.Validate(settings);

   var intermediateResult = opts.ApplyTo(db.myEntities).ToArray();

   var result = //change intermediateResult as you wish.

   return result;
}

基於 Ihar 的回答,這裡是應用查詢選項然後修改結果集合的完整範例。

public async Task<IHttpActionResult> Get(ODataQueryOptions<MyModel> options)
{
   var query = _service.Query();

   var result = ((IQueryable<MyModel>)options.ApplyTo(query, new ODataQuerySettings()))
                                             .ToArray();

   foreach (var model in result)
   {
       model.SomeNonQueriedValue = "Something else";
   }

   return Ok(result);
}

引用自:https://stackoverflow.com/questions/29953323