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 をオーバーライドすることになります (または、式ツリーを自分で手動で処理するだけです) が、この特定の例はまだバグのように思えます。
誰かが私にこれについての洞察を与えることができますか? たぶん、私が見逃しているものがあるだけです。