レポートモデル(SQL Server Reporting Services)のデータソースを作成しています。レポートには、多くの結合と計算が必要です(たとえば、これに費やされた金額、つまり金額Aと金額Bなどの財務パラメーターの計算)...これにはすべてサブオブジェクトが含まれます。
このコードの単体テストを作成することは私にとって非常に理にかなっています(つまり、注文の収集をウォークスルーしたり、ビジネスルールやサブオブジェクトに基づいて情報を集約したりします)。このような
foreach (IOrder in Orders)
foreach (IOrderLine in IOrder.Orderlines)
...
return ...
次に、戻り値をテストします。
ただし、このコードは、レポートビューで使用されるSQLではありません...もちろん...データベースに.NETアセンブリをプラグインできると思います。ここでの問題は、もちろん、パフォーマンスです...これらすべてのオブジェクトをC#でループさせたくありません...遅すぎます。
したがって、当然、Linq / Lambda/Expressionツリーが私への答えのようです。ご存知のように、Linq to SQLを実行すると、式ツリーが構築され、それらに基づいて適切なSQLが生成されます。
したがって、ラムダ式を使用してLinq to Objectsでコードを記述し、サンプルコレクション(式を.netにコンパイルしたもの)でこのコードをユニットテストし、DBストアドプロシージャでLinqtoSQLと同じコードを再利用できます。 SQL Serverは、適切なSQLを生成します(Linq to SQLがすでに生成しているように)...
そうすれば、単体テストとC#でのドメインロジックコードの記述、およびレポート用の高性能なストアドプロシージャの両方のメリットを享受できます。
可能?SQL ServerCLRストアドプロシージャでLinq/Lambdaを使用できますか?誰かがそれをしたか、それを機能させる方法を知っていますか?私は夢中ですか?あなたはそれをするより良い方法を知っていますか?
ありがとう
PS私は今、これがどのように適切に行われるべきかを理解したと思います。ウディ・ダーハンによれば、私が彼を正しく理解していれば。データベースを非正規化し、計算されたすべてのフィールドをテーブル内のオブジェクトに配置する必要があります。サブオブジェクト(OrderLineが追加された)で何かが発生すると、Customerオブジェクトはイベントを受信し、スマート値を再計算する必要があります(キャッシュして永続化します)。
次に、レポートはロジックなしで簡単に進み、高速に動作します...