FUNCTION (Entity SQL)
Entity SQL クエリ コマンドのスコープに関数を定義します。
FUNCTION function-name
( [ { parameter_name <type_definition>
[ ,... n ]
]
) AS ( function_expression )
<type_definition>::=
{ data_type | COLLECTION ( <type_definition> )
| REF ( data_type )
| ROW ( row_expression )
}
引数
- function-name
関数名。
- parameter-name
関数のパラメーター名。
- function_expression
関数である有効な Entity SQL 式。 関数内のコマンドは、関数に渡される parameter_name パラメーターに基づいて実行されます。
- data_type
サポートされる型の名前。
- COLLECTION ( <type_definition> )
サポートされる型、行、または参照のコレクションを返す式。
- REF ( data_type )
エンティティ型への参照を返す式。
- ROW ( row_expression )
1 つまたは複数の値から構造的に型指定された匿名レコードを返す式。 詳細については、「ROW (Entity SQL)」を参照してください。
解説
関数のシグネチャが異なっていれば、名前が同じ複数の関数をインラインで宣言することは可能です。 詳細については、「関数のオーバーロードの解決方法 (Entity SQL)」を参照してください。
関数がインラインである場合、Entity SQL コマンドに呼び出せるのは、そのコマンド内で定義された後のみです。 ただし、インライン関数を別のインライン関数内で呼び出す場合には、呼び出される関数が定義される前でも後でもかまいません。 次の例では、関数 B が定義される前に、関数 A が関数 B を呼び出しています。
Function A() as ('A calls B. ' + B())
Function B() as ('B was called.')
A()
詳細については、「方法: ユーザー定義関数を呼び出す (Entity Framework)」を参照してください。
関数をモデル自体で宣言することもできます。 モデルで宣言された関数は、コマンドでインラインで宣言された関数と同じように実行されます。 詳細については、「ユーザー定義関数 (Entity SQL)」を参照してください。
例
次の Entity SQL コマンドは、関数 Products を定義します。この関数は、整数値を受け取って、返された製品をフィルター処理します。
USING Microsoft.Samples.Entity;
FUNCTION Products(listPrice Int32) AS
(
SELECT VALUE p FROM AdventureWorksEntities.Products AS p WHERE p.ListPrice >= listPrice
)
select p from Products(@price) as p
次の Entity SQL コマンドは、関数 StringReturnsCollection を定義します。この関数は、文字列のコレクションを受け取って、返された連絡先をフィルター処理します。
USING Microsoft.Samples.Entity;
FUNCTION GetSpecificContacts(Ids Collection(Int32)) AS
(
SELECT VALUE id FROM Ids AS id WHERE id < @price
)
GetSpecificContacts(SELECT VALUE c.ContactID FROM AdventureWorksEntities.Contacts as c)