2013-07-03 15 views
9

Entity FrameworkでJSON文字列を照会する行を探している人は誰でも探しています。SQL ServerでJSON文字列を照会するためのEntity Framework

私はここで何をしようとしているのかについて少しの背景を述べるべきです。私が使用しているデータベースは、私が取り組んでいるワークフローエンジン用です。すべてのワークフローデータを処理し、カスタムデータをJSON文字列として保存することもできます。私が使用しているワークフローエンジンは、リクエストごとにJSON文字列のシリアライズとデシリアライズを処理しますが、JSON文字列の値に基づいてクエリとフィルタを行いたい場合は、プルする必要がありますテーブル全体をメモリに格納し、すべてのエントリをデシリアライズしてからフィルタリングします。明らかな理由から、これは容認できません。その理由は、このワークフローエンジンを使用するすべてのアプリケーションで使用できる単一のワークフローデータベースが必要なためです。カスタムデータを取得するために、アプリケーション固有のデータベースを分離するためにデータベース間のビューを行う必要がありません。ほとんどの場合、JSON文字列として格納されているカスタムリクエストデータは比較的単純なものであり、ほとんどの場合、設計時にはクエリを行う際には必要ありません。しかし、カスタム検索を行う必要がある場合は、これらのカスタムJSONオブジェクトを解析できる方法が必要です。そして、私はこれがEntityで動的に実行できることを望んでいるので、特定のタイプのオブジェクトを照会するために追加のストアドプロシージャを書く必要はありません。理想的には、エンティティを使用して任意のJSONデータ構造のクエリを可能にするライブラリを1つだけ持つことになります。

私は、JSONを解析し、値(親オブジェクトID、名前、値、タイプ)を含むフラットテーブルを返すデータベース関数を使い始めました。その後、その関数を自分のエンティティモデルにインポートしました。コードを入手した場所へのリンクがあります。かなり面白い記事。

Consuming JSON Strings in SQL Server

は、ここで私がでてるところの基礎です。

using (var db = new WorkflowEntities()) { 
    var objects = db.Requests.RequestData(); 
} 

上記のコード例では、RequestオブジェクトはベースワークフローRequestオブジェクトです。 RequestData()はタイプの拡張メソッドです

DbSet<Request> 

parseJSONは私のデータベース関数の名前です。

私の計画は、私はこのようになりますオブジェクトを持っている場合、例えばのでQueryables

IQueryable<parseJSON_result> 

をフィルタリングします拡張メソッドのシリーズを書くことです。

RequestDetail : { 
    RequestNumber: '123', 
    RequestType: 1, 
    CustomerId: 1 
} 

私はそれらの線に沿って

db.Request.RequestData().Where("RequestType", 1); 

か何かのような何かを行うことができるだろう。 .Whereメソッドは、解析されたJSONを含むIQueryableであるRequestData()を取得し、新しいIQueryable結果をフィルタリングして返します。

私の質問は本当にありますが、誰もこれのようなことをしましたか?もしそうなら、どのようなアプローチを取っていますか?私の元来の意図は、何らかの辞書スタイルをすることでしたが、それは難しそうでした。どんな考え、アイデア、提案、知恵も大歓迎です。私はこれをしばらく働いていましたが、実際にはそれほど遠くまで逃げなかったような気がします。ほとんどの場合、私は構文をどのように見せたいかを決めることができないので、私はもっと多くの作業データベース側を行うべきかどうかはわかりません。

これは私の構文の元のアイデアですが、オブジェクトを水和することなく[]演算子を実行できませんでした。

db.Request.Where(req => req.RequestData()["RequestType"] == 1).Select(req => req.RequestData()["CustomerInfo"]); 

、ちょうど全部を読むために時間を割いて感謝し、私はこれはかなり長い記事で知っているので、あなたはここまで読んだ場合。

+0

json responeをpocoクラスにデシリアライズして使用することができます。 –

+0

RAZERが提案したアプローチを使用しました。 POCOを作成し、シリアライズとデシリアライズにJson.NETを使用します。 – jake

答えて

0

あなたができることは、CLR SQL Serverユーザー定義関数を作成してクエリから使用することです。

は私がテーブル値関数は、あなたの状況に、より適していると思うだろうhttps://msdn.microsoft.com/en-us/library/ms131077.aspx

このリンクを参照してください。

1

SQL Server 2016では、FOR XMLとOPENXMLに相当するFOR JSONとOPENJSONが存在します。 NVARCHARカラムに格納されているJSONを参照する式のインデックスを作成できます。

+0

Entity Frameworkはこれをサポートしていますか? – Zapnologica

0

これは非常に遅く答えですが、それでも検索された人のための...

@Emyrが言うように、SQL 2016はJSON_VALUEまたはOPENJSONステートメントを使用してJSON列内の照会をサポートしています。

Entity Frameworkではこれを直接サポートしていませんが、SqlQueryメソッドを使用して、JSON列内でクエリを実行できるデータベースに対して直接SQLコマンドを実行し、単純なクエリを実行するために各行のクエリとデシリアライズを保存できます。 。

関連する問題