2015-11-06 6 views
5

私は(簡体字)の作業を持っているODataControllerインスタンス化する方法をODataQueryOptions以下の方法

public class MyTypeController : ODataController 
{ 
    [HttpGet] 
    [EnableQuery] 
    [ODataRoute("myTypes")] 
    public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options) 
    { 
    return _repo.myResultsAsQueryable(); 
    } 
} 

私は、サーバーからこのメソッドを呼び出すと、私はODataQueryContextを必要とODataQueryOptionsをインスタンス化する必要がこれを行うにできるようにしたいと思います。

これを行う方法の例(例:hereおよびhere)がありますが、それらはすべて以前のバージョンのODataを参照しているようです。 ODataQueryContextコンストラクタには現在、3番目の引数(ODataPathパス)が必要です。これは、私が見つけることができる例では扱われていません。

編集: @snow_FFFFFF、ここではいくつかのより多くの文脈だ...私は単純にHttpClientを経由してのODataエンドポイントを消費することができることを認識し、私はあなたが言うように、直接のIQueryableと対話したいと思います。

問題は、私が取り組んでいるアプリケーションでは、ユーザーが保存して後で他のユーザーが呼び出すことのできるフィルタ(洗練された検索エンジンなど)を作成できるということです。 JSクライアントからは、IDでフィルタを検索し、フィルタをクエリ文字列に適用してODataエンドポイントに対してクエリを発行します。これはクライアント側から非常にうまく動作しますが、私はサーバ側と同様のことをすることができるようにしたいと考えています。

これは私がやりたいことですが、どうすればODataPath引数をインスタンス化できますか?

public IQueryable<MyType> FilterMyTypes(int filterID) 
{ 
    // lookup filter by filterID from db... 
    filter = "$filter=Status eq 1"; // for example... 

    ODataPath path = // but how can I get the path!!! 
    new ODataQueryContext(edmModel, typeof(MyType), path); 

    var uri = new HttpRequestMessage(HttpMethod.Get, "http://localhost:56339/mytypes?" + filter); 
    var opts = new ODataQueryOptions<MyType>(ctx, uri); 

    var results = new MyTypeController().GetMyTypes(opts); 
} 

本の別の用途は、以下のように動的なグループ化をサポートするために、次のようになります。

[HttpGet] 
[Route("myTypes/{filterID:int}/groupby/{groupByFieldName}")] 
public IHttpActionResult GroupMyTypes(int filterID, string groupByFieldName) 
{ 
    // For example: get all Active MyTypes and group by AssignedToUserID... 

    // Get the results of the filter as IQueryable... 
    var results = FilterMyTypes(filterID); 

    // group on groupByFieldName 
    var grouped = results.GroupBy(x => GetPropertyValue(x,groupByFieldName)); 

    // select the groupByFieldName and the count 
    var transformedResults = grouped.Select(g => new { g.Key, Count = g.Count() }); 

    return Ok(transformedResults); 
} 
+1

http://github.com/OData/WebApiには、参照できるテストケースが多数あります。たとえば、ODataQueryContextについては、次を参照してください。https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/ODataQueryContextTests.cs#L181- L200 –

+0

サムに感謝、私はそれを試してみる...オープンソースを持っているMSには慣れていない... –

+0

サム。あなたは素晴らしいです!それを答えに入れると、私はそれを受け入れることができます。本当にありがとう。魅力のように働いた。 –

答えて

3

確かに。 ODataPathは、OData Uri specに続くODataPathSegmentのリストです。ウェブAPIのODataで

は、例えば、ODataPathをインスタンス化するのは簡単です:

IEdmModel model = GetEdmModel(); 
IEdmEntitySet entitySet = model.EntityContainer.FindEntitySet(setName); 
ODataPath path = new ODataPath(new EntitySetPathSegment(entitySet)); 

上記pathそれはようODATAテンプレートを持っていることのODataの仕様に追従:

~/entityset 

詳細テストケース(コード)は見つかりませんでした。here

+1

2011年1月25日現在、 'Microsoft.AspNet.OData'の最新の安定版はv6.0.0です。 'EntitySetPathSegment'クラスがなくなったようです。 NuGetを5.9.1にダウングレードする必要がありました。そうでなければ、非常に有益な質問で、私はソースコードのテストケースへのリンクを本当に感謝しています。 – asporter

+0

ボーイングリンクは本日時点のものです。 –

0

あなたのODATAコントローラは、データへのHTTPインターフェースを提供している、あなたは、HTTP経由でアクセスしてはいけません(たとえサーバーから)?あなたが同じプロジェクト、なぜないから呼び出すことができたIQueryableを返す一般的な方法の中からこれをやっている場合は、

https://visualstudiogallery.msdn.microsoft.com/9b786c0e-79d1-4a50-89a5-125e57475937

または:そこVSアドインここODATAクライアントコードを生成することですあなたのコードまたはコントローラから?

UPDATE:元の質問ではより多くの情報に基づいて:

あなたは、コントローラのメソッドで定義されたODataQueryOptionsを持っている場合、それはあなたがそのメソッドを呼び出しているだけでなく、形成されODATAクエリを解析することができます。私は、最終結果を返すために複数のデータソースを照会する必要があったため、odataクエリの一部を翻訳する必要があるときにこれを使用しました。

あなたは非ODATAパラメータとオプションを取る何かをしたいように聞こえます。このために、あなたはおそらく、カスタムアクションを見てする必要があり、または機能(あなただけのデータを返している場合は、おそらく機能):

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-actions-and-functions

UPDATE#2:そして、より詳細な読書の後、私は思います私はあなたのポイントを逃した - 私は答えを持っていないが、私はそれで周りに遊ぶだろう。あなたは単にURL自体を改革することはできません(クエリオプションをインスタンス化するのではなく?

UPDATE#3:あなたは、それが実際にはodataリクエストではないと思っていると思ってしまうのは難しいことだと思います。戻る私のオリジナルの答えで述べた二つ目のオプションに - なぜあなたは使用することができますし、ODATAコントローラが使用できる共通の方法 - このような何か:

// some sort of helper class 
public class HelperObject 
{ 
    public static IQueryable<MyType> GetGroupedValues(int filterID, string groupByFieldName) 
    { 
     // all your code/logic here 
    } 
} 

// your odata controller uses the helper 
[HttpGet] 
[Route("myTypes/{filterID:int}/groupby/{groupByFieldName}")] 
public IHttpActionResult GroupMyTypes(int filterID, string groupByFieldName) 
{ 
    return Ok(HelperObject.GetGroupedValues(filterID, groupByFieldName)); 
} 

// ... and so does your other code that wants to do the same thing 
var x = HelperObject.GetGroupedValues(filterID, groupByFieldName); 
関連する問題