4

OData オプションを手動で処理できるように、Web API 2.2 ODataController をセットアップしました (つまり、[EnableQuery] を使用せずに、または ODataQueryOptions パラメーターを使用します)。ただし、バグのように見えるものに遭遇しました。次のコードがあるとします。

public IHttpActionResult GetEmployees() {
//Get Queryable Item (in this case just an in-memory List made queryable)
  IQueryable<Employee> employees = _Employees.AsQueryable();

//Get Requested URI without querystring (there may be other ways of doing this)
  String newUri = Request.RequestUri.AbsoluteUri;
  if (!String.IsNullOrEmpty(Request.RequestUri.Query)) {
    newUri = newUri.Replace(Request.RequestUri.Query, "");
  }

//Add custom OData querystring (this is for example purposes)
  newUri = String.Format("{0}?$skip={1}&$top={2}", newUri, 1, 1);

//Create new HttpRequestMessage from the updated URI
  HttpRequestMessage newRequest = new HttpRequestMessage(Request.Method, newUri);

//Create new ODataQueryContext based off initial request (required to create ODataQueryOptions)
  ODataQueryContext newContext = new ODataQueryContext(Request.ODataProperties().Model, typeof(Employee), Request.ODataProperties().Path);

//Create new ODataQueryOptions based off new context and new request
  ODataQueryOptions<Employee> newOptions = new ODataQueryOptions<Employee>(newContext, newRequest);

//Apply the new ODataQueryOptions to the Queryable Item
  employees = newOptions.ApplyTo(employees) as IQueryable<Employee>;

//Return List (will be serialized by OData formatter)
  return Ok(employees.ToList());
}

これは 100% 機能しますが、次のように $select または $expand を追加します。

newUri = String.Format("{0}?$skip={1}&$top={2}&$expand=Projects", newUri, 1, 1);

からnullを返します

employees = newOptions.ApplyTo(employees) as IQueryable<Employee>;

そのため、2 つの個別の ODataQueryOptions を作成する必要がありました。1 つは IQueryable に適用するもの ($select または $expand なし) で、もう 1 つは $selects/$expands のみを使用して SelectExpandClause を構築し、Request.ODataProperties().SelectExpandClause に割り当てます。

null が返される理由がわかりません。このコードの背後にある主な目的は、Entity Framework 以外の ORM を操作するときに、OData の処理を​​より適切に制御できるようにすることです。現実的には、いずれにしても applyTo をオーバーライドすることになります (または、式ツリーを自分で手動で処理するだけです) が、この特定の例はまだバグのように思えます。

誰かが私にこれについての洞察を与えることができますか? たぶん、私が見逃しているものがあるだけです。

4

1 に答える 1