しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Entity Framework 使うなら読んでおくべきな記事

Entity Framework は LINQ to SQL と違って Entity SQL 経由で実行されます。いきなり SQL を生成する LINQ to SQL とは異なり 1 つ挟まってます。

それはともかく、Entity Framework でも LINQ to SQL でも問題になるのがクエリ式内部では特定の CLR オブジェクト、メソッドしか使えないということ。例えば

context.Products.OrderBy(p => new Random().Next());

といったクエリ式は実行時に Random.Next に対応する SQL 関数が無いとか言われて失敗します。じゃあ、Entity Framework でランダム抽出をするにはどうするん?という話になりますが、ちゃんと解は用意されていました。

CLR メソッドと正規関数とのマッピング

Entity Framework で利用可能な CLR メソッドを表でまとめられています。この表にある CLR メソッドはクエリ式内で記述すると、自動的に適切な正規関数に変換されるので利用することが出来ます。

正規関数

Entity SQL で定義されている正規関数の一覧です。クエリ式は Entity SQL に変換されるので、どういった関数が用意されているか一度は目を通しておくと良いと思います。

概念モデル正規関数と SQL Server 関数とのマッピング

Entity SQL 正規関数と Transact-SQL 関数とのマッピング表です。最終的には Transact-SQL に変換して利用するシナリオが多いと思います。

では最初に挙げたランダム抽出を行うクエリ式を書いてみましょう。CLR メソッドと正規関数のマッピングを調べると Guid.NewGuid が利用可能なことがわかりますので、これを利用してみます。

context.Products.OrderBy(p => Guid.NewGuid());

はい、たったこれだけでランダム抽出が出来ます。何となく見た目は気持ち悪いですが、ちゃんと Guid.NewGuid がマッピングされるので動作します。

Entity Framework は CTP4 で Code First 開発にも対応し、SQL Server Compact 4 も CTP がリリースされているので簡単に試すことが出来るようになっています。この機会に試しちゃってください。