0

私が取り組んでいるアプリでは、Linq to EF を広範囲に使用しています。マルチテナントなので、さまざまな顧客がすべてのデータをすべて同じデータベースに保存します。

一部の顧客は、カスタム レポートを希望しています。理想的には、これらのカスタム レポートの定義は顧客に対してデータベースに保存されます。これらのレポートをメイン コードにハードコードすることは現実的ではないためです (すぐに手に負えなくなります)。

私はこれを過去に SQL 文字列を保存してから解決しましたcontext.SqlQuery(myReportSQL)。それは十分に機能します。

2つの考え:

  1. 現時点では、SQL 文字列をお客様が編集することはできません。間違った種類のクエリが実行されるのを避けるために、内部で管理されます。これを顧客にどのように説明することをお勧めしますか? クエリ ビルダー インターフェース (プラグインの提案は歓迎)? SELECT ステートメントのみを許可するものはありますか?

  2. より良いアプローチは、LINQ to EF クエリを使用することです。これは、SELECT のみであることを確認する方が簡単であり、最後に追加の WHERE をチェーンして、適切なデータのみを取得できるようにし、読みやすくするためです。

では、オプション 2 では、これをデータベースに保存し、効果的に「評価」するにはどうすればよいでしょうか。

ある程度役立つDynamic LINQライブラリを見てきましたが、それが古くなり、ドロップされる可能性があるか、EF6などをサポートしていないのではないかと心配しています.

4

3 に答える 3

0

私は同様の目的で動的 linq を使用しましたが、フレームワークに組み込まれていないことについて同じ懸念がありました。アイデアは、1 つの大きなクエリではなくフラグメントを格納することでした。たとえば、親関係から離れた列を表示する場合、その列の式として「Parent.Column」があります。この点で、すべての結合などを記述する必要がないため、SQL よりも作成および保守がはるかに簡単です。

また、式と演算子を格納し、値で渡される述語の概念もありました。たとえば、「Parent.Column」と「Equals」を格納し、辞書に値を渡します。例: 辞書["parentColumn"]

これはレポート用だとおっしゃいましたが、データソースを定義してビジネス ユーザーが独自のレポートを作成できるようにする SSRS (SQL Server Reporting Services) の使用を検討しましたか? データソースを別の方法で定義することにより、マルチテナンシーを処理できる場合があります。

于 2013-11-06T18:16:05.960 に答える
0

マルチテナントでは、動的クエリでセキュリティをどのように処理するかが難しい部分です

顧客 ID のパラメーターをハードコーディングするテーブル値関数から始めます。

それを使用して、いくつかの直接テーブルといくつかの一般的な結合を構築します

関数

ビューはセキュリティを考慮に入れていますが、残念ながら (私が知っている) パラメータを渡すことはできないため、複数の顧客が同じビューを使用する可能性があります。顧客ごとにバージョンを作成するというビューを持つことができます。

于 2013-11-06T15:34:13.857 に答える
0

任意の形式でクエリを保存する場合は、SQL を選択します。これは、db クエリが実行される最終的な形式であり、人間が判読でき、プレーン テキスト形式で簡単に保存できるためです。もちろん、これはデータベース自体がストアド プロシージャとビュー定義を使用して行うこととまったく同じです。したがって、データベースが提供する機能を単純に使用して、ストアド プロシージャまたはビュー定義を操作することもできます。

アプリケーションが使用されるコンテキストに応じて、既存のデータベース レポート ツール (MS SSRS など) は、データベース セキュリティとクエリ機能を活用し、展開プラットフォームを提供します。

ユーザーがクエリを変更できるようにする方法に関する質問に答えるには、さまざまな質問を考慮する必要があります。

  • ユーザーがクエリを最も快適に変更できる形式はどれですか (例: SQL、グラフィック クエリ ビルダーなど)。
  • ユーザーが適切な DML コマンドと承認されたデータのみにアクセスできるようにするために実装する必要があるセキュリティ制限は何か (繰り返しますが、データベースはセキュリティ機能を提供するため、車輪を再発明しないようにしてください)
  • ユーザーが他のユーザーに影響を与えずにクエリをカスタマイズできるようにするために必要なバージョン管理機能は何ですか?

次に、アプローチを決定し、ソリューションを設計します。

于 2013-11-06T15:33:48.673 に答える