2017-10-25 16 views
2

OData v4、エンティティおよびC#を使用してWeb APIを構築する作業で、次の問題が発生しました。私は、次のような行、などいくつかの毎年の情報を持っている私のDB(SQL Serverなど)のビュー...OData v4 APIで動的クエリ可能エンティティを使用するにはどうすればよいですか?

|Year |Value | 
    1985 8.7 
    1986 8.8 

を持っているしかし、私は列としてそれらを提供する必要があります。

|1985 |1986 | 
    8.7 8.8 

年です動的なモデルクラスを作成する方法を見つけることができませんでした。そのため、私はコントローラーのデータを提供する方法を見つけることができませんでした。私はC#コードを使用して情報をピボットすることができましたが、対応するモデルがなかったのでODataはそれを提供しません。

MedallionOdataという名前のライブラリを使用しようとしましたが、ダイナミックでクエリ可能なODataEntityがありますが、動作させることができませんでした。

ODataのクエリ可能な側面を維持しながら動的エンティティを処理する最適な方法は何ですか?

+0

を私は思います[この投稿](https://stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql/13377114#13377114)には、あなたが探している回答があります。 –

+0

私はDB上のデータをピボットする前にそのポストを使用しましたが、それは私が探しているものではなく、問題はモデルにあります...私はODataの "open types"でそれを実行できました。 –

答えて

0

ODataには、あなたが探しているものを達成するのに役立つと思われる「オープンタイプ」の概念があります。基本的には、オブジェクトに任意のプロパティを追加することができます。

あなたがODataConventionModelBuilderを使用している場合、それはこのようなあなたのモデルクラスにタイプIDictionary<string, object>のプロパティを追加するのと同じくらい簡単です:

public IDictionary<string, object> Properties { get; set; } 

あなたがここで詳細を見つけることができます。 https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/use-open-types-in-odata-v4

+0

それは働いた!どうもありがとうございました。これで、APIが公開タイプに対応できるようになり、一部のフィルタが機能しています。私はまだ、1985年の値だけを返すAPIを望んでいた場合など、オープン型を選択する方法を考えています... –

+0

それは素晴らしいです、それが解決したら答えを受け入れることができますか?問題: ダイナミックプロパティに '$ select'と' $ filter'を行うことができるはずです。通常のプロパティであるかのようにします。 – TomDoesCode

+0

私は動的ではないプロパティで ' { "エラー":{ "コード": "" "、 "メッセージ ":" URIで指定されたクエリが有効ではありません。"innererror":{ "メッセージ": "識別子が0の位置にあると予想されました。"、 "type": "Microsoft.OData.ODataEx "stacktrace": "..." –

関連する問題