Entity Fraamewark 4 inアクション読書ノート——第四章:LINQ to Enttiesを使って照会する:使用関数…
3093 ワード
4.7使用関数
LIQ to Enttiesクエリを拡張する簡単な方法は、関数を使用することです.4種類の関数が適用できます.
規範関数-LINQ to Entties自体が提供していない定義済みの関数のセットです.
データベース関数-事前定義のSQL Server関数のセット.
モデルで定義された関数−EDMに記憶されたユーザ定義のエンティティSQL関数.
ユーザー定義のデータベース関数-クエリーで使用できるユーザー定義のデータベース関数.
この部分では、仕様関数とデータベース関数だけに関連し、他の2つの関数はより多くの解釈とEFのより深い知識が必要で、11章で議論します.
4.7.1規範関数
規範関数はデータベース操作を行うための有効な方法です.例えば、数学演算、日付比較を行う関数などがあります.EF 1.0では、仕様関数はEntity SQLクエリでのみ実行できますが、現在はCLR方式で実装されています.そうすると、LIQ to Enttiesに呼び出されます.この変化は既存の機能を再利用することで、LIQ to Enttiesの機能を拡張します.
例を見に来ました.私たちの取引先は5日間以上出荷する注文リストがほしいです.LIQクエリを使うのはかなり簡単です.
この脆弱性をディフデイズ法を用いて標準関数を補填し,この方法は2つの日付をパラメータとして受け入れ,それらの間の日数を返します.この方法および他の仕様関数の部分は、System.Data.Objectsの名前空間におけるEnttityFunctions類で見つけることができる.
これらの関数は、クエリ内の任意の位置で呼び出すことができます.例えば、あなたはselect子文の中でAbs関数を使って一つの数の絶対値を取得することができます.
規範関数は、エンティティSQLとデータベースとは無関係の関数である.しかし、多くの場合、あなたのコードを特定のデータベースに指定しても問題はないです.このような場合は、特定のデータベースの関数を呼び出して、より良いプラットフォームを使用することができます.
4.7.2データベース関数
各データベースには独自の関数セットがあります.いくつかの関数は異なるRDBMSで共通しています.例えば、ABS、LTRLIm、RTrimのように、LIQ to Entintiesまたは実体関数で呼び出すことができます.他の関数は各データベースに特有のものです.または、異なる特徴があります.
幸いなことに、あなたもこれらの関数を呼び出すことができます.EFはSystem.Data.Objectis.Sql Cient名前空間のSql Functions類にはSQL Serverに指定された関数がたくさんあります.Checksum,CharIndex,Cos,GetDateおよびRandはこれらの有用な関数の例である.
標準関数とデータベース関数が異なるクラスに属する以外は、他の区別はありません.これらはすべて静的方法として呼び出され、クエリーのどの位置でも呼び出される.下のコードはデータベース関数を使って5日間以上出荷した注文を見せます.
データベースに特定の関数を使うことは、データベースを一つのデータベースプラットフォームに合わせる二つの方法の一つです.もう一つの選択はコードにSQLクエリを埋め込むことです.SQLが標準の言語であっても、クエリは特定のデータベースの特徴に依存しますので、最終的にはあなたのコードを特定のデータベースに指定します.
LIQ to Enttiesクエリを拡張する簡単な方法は、関数を使用することです.4種類の関数が適用できます.
規範関数-LINQ to Entties自体が提供していない定義済みの関数のセットです.
データベース関数-事前定義のSQL Server関数のセット.
モデルで定義された関数−EDMに記憶されたユーザ定義のエンティティSQL関数.
ユーザー定義のデータベース関数-クエリーで使用できるユーザー定義のデータベース関数.
この部分では、仕様関数とデータベース関数だけに関連し、他の2つの関数はより多くの解釈とEFのより深い知識が必要で、11章で議論します.
4.7.1規範関数
規範関数はデータベース操作を行うための有効な方法です.例えば、数学演算、日付比較を行う関数などがあります.EF 1.0では、仕様関数はEntity SQLクエリでのみ実行できますが、現在はCLR方式で実装されています.そうすると、LIQ to Enttiesに呼び出されます.この変化は既存の機能を再利用することで、LIQ to Enttiesの機能を拡張します.
例を見に来ました.私たちの取引先は5日間以上出荷する注文リストがほしいです.LIQクエリを使うのはかなり簡単です.
var result = from o in ctx.Orders
where o.OrderDate.AddDays(5) < o.ActualShippingDate
select o;
検索コンパイルは通過しますが、実行時に異常が発生します.翻訳エンジンはAddDays方法を適切なSQLに変換できないからです.この脆弱性をディフデイズ法を用いて標準関数を補填し,この方法は2つの日付をパラメータとして受け入れ,それらの間の日数を返します.この方法および他の仕様関数の部分は、System.Data.Objectsの名前空間におけるEnttityFunctions類で見つけることができる.
var result = from o in ctx.Orders
where EntityFunctions.DiffDays(o.OrderDate, o.ActualShippingDate) > 5
select o;
別の例は数学関数を使用します.四捨五入、上取、下取り、数のn乗はすべてSystem.Mathクラスの方法で実行できます.しかし、DateTime方法のように、SQL翻訳エンジンはMath中の方法をサポートしていません.代わりにEnttityFuntionsクラスのPow,Round,Celing,Flookを使用できます.これらの関数は、クエリ内の任意の位置で呼び出すことができます.例えば、あなたはselect子文の中でAbs関数を使って一つの数の絶対値を取得することができます.
規範関数は、エンティティSQLとデータベースとは無関係の関数である.しかし、多くの場合、あなたのコードを特定のデータベースに指定しても問題はないです.このような場合は、特定のデータベースの関数を呼び出して、より良いプラットフォームを使用することができます.
4.7.2データベース関数
各データベースには独自の関数セットがあります.いくつかの関数は異なるRDBMSで共通しています.例えば、ABS、LTRLIm、RTrimのように、LIQ to Entintiesまたは実体関数で呼び出すことができます.他の関数は各データベースに特有のものです.または、異なる特徴があります.
幸いなことに、あなたもこれらの関数を呼び出すことができます.EFはSystem.Data.Objectis.Sql Cient名前空間のSql Functions類にはSQL Serverに指定された関数がたくさんあります.Checksum,CharIndex,Cos,GetDateおよびRandはこれらの有用な関数の例である.
標準関数とデータベース関数が異なるクラスに属する以外は、他の区別はありません.これらはすべて静的方法として呼び出され、クエリーのどの位置でも呼び出される.下のコードはデータベース関数を使って5日間以上出荷した注文を見せます.
var result = from o in ctx.Orders
where SqlFunctions.DateDiff("d", o.OrderDate, o.ActualShippingDate) > 5
select o;
データベース関数を使うことで、特定のデータベースにコードを合わせます.これはいつもいいアイデアではないです.データベースを変えるとコードを変えなければならないからです.しかし、もしあなたがあなたのアプリケーションのデータベースを変更しないと知っているなら、データベース関数を使っても大丈夫です.これらの関数を使うべきかどうか、慎重に考えてください.データベースに特定の関数を使うことは、データベースを一つのデータベースプラットフォームに合わせる二つの方法の一つです.もう一つの選択はコードにSQLクエリを埋め込むことです.SQLが標準の言語であっても、クエリは特定のデータベースの特徴に依存しますので、最終的にはあなたのコードを特定のデータベースに指定します.