Asp.net-Web-Api
查詢後修改odata結果
我有一個使用 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); }