ページ

2006年6月14日水曜日

DLinq でプロシージャとファンクションのサポート

Spring Linq CTP finally hits the shelves!
DLinq User-Defined Function support より


sqlmetal というツールを使って DLinq で必要になるソースコードを自動作成してくれるそうですが、このとき /sprocs というオプションをつけておくとストアドプロシージャを呼び出すためのコードも作成してくれるそうです。
この 「ストアドプロシージャを呼び出すためのコード」 ですが、MethodInfo.GetCurrentMethod() を引数に ExecuteStoredProcedure を呼び出すというような感じで書かれています。これからすると、呼び出し元メソッド自身の Attribute なんかを見て呼び出すべきプロシージャの名前や引数を決定して、普通に呼び出すだけみたいですね (けど、これだと実行のたびに解釈しなくちゃいけないような気がする)。


同じく /functions をつけておくとユーザ定義関数 (User Defined Function) を呼び出すためのコードを作成してくれるそうです。
こちらは Expression Tree を作り出すコードが作り出されています。そのおかげで、


var q = from c in db.Categories
            select new {c.CategoryName,
            Total=db.TotalProductUnitPriceByCategory(c.CategoryID)};


という C# 上のコードが


SELECT [t0].[CategoryID],
               [dbo].[TotalProductUnitPriceByCategory]([t0].[CategoryID]) AS [value]
FROM [Categories] AS [t0]


という SQL に展開されるわけですね (すなわち、ユーザ定義関数は SQL 上で実行されるのであって、C# 上で実行されるのではない)。

0 件のコメント:

コメントを投稿