関数および関数パラメータ (メタデータ)
関数とは、アクションを実行して、その結果を値として返すルーチンです。System.Data.Metadata.Edm 名前空間は、エンティティ フレームワーク に定義されている正規の関数の他に、基になるストレージ プロバイダやデータベースに定義されているストア固有の関数を公開するクラスを提供します。
正規の関数は、エンティティ フレームワーク の概念モデルに定義されています。これらの関数は、最もよく使用されるストア固有の関数を表します。たとえば、概念モデルには関数 Edm.Max があり、ストレージ モデルには関数 SqlServer.Max があります。Entity SQL クエリで正規の関数を使用すると、適切な関数がストレージ プロバイダで呼び出されます。エンティティ フレームワーク における正規の関数の詳細については、「正規関数 (Entity SQL)」を参照してください。
EdmFunction クラスを使用すると、概念モデルに定義されている正規の関数に関する情報、および基になるストレージ プロバイダやストレージ モデルに定義されている関数に関する情報を取得できます。
また、System.Data.Metadata.Edm.MetadataWorkspace.GetFunctions(System.String,System.String,System.String) メソッドを使用して、特定の関数のすべてのオーバーロードを取得することもできます。
次のコード サンプルでは、接続からメタデータ ワークスペースを取得した後、そのメタデータ ワークスペースを使用して、概念モデルの Count 正規関数とストレージ モデル内の基になるストレージ プロバイダが提供する COUNT 関数に関する情報を取得します。メタデータ ワークスペースは、ランタイム サービス コンポーネントとして、メタデータの取得をサポートします。
このコード サンプルでは、「AdventureWorks オブジェクト モデルの使用 (EDM)」で指定されたアプリケーション構成文字列を使用して、AdventureWorks データベースに接続します。
using System;
using System.Data;
using System.Data.EntityClient;
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
class GetFunctionsExample
{
static void Main()
{
try
{
// Establish a connection to the underlying data provider by
// using the connection string specified in the config file.
using (EntityConnection connection =
new EntityConnection("Name=AdventureWorksEntities"))
{
// Open the connection.
connection.Open();
// Access the metadata workspace.
MetadataWorkspace workspace =
connection.GetMetadataWorkspace();
// Get functions from the conceptual model.
GetFunctionsFromModel(workspace, DataSpace.CSpace,
"Count", "Edm");
// Get functions from the storage model.
GetFunctionsFromModel(workspace, DataSpace.SSpace,
"COUNT", "SqlServer");
}
}
catch (MetadataException exceptionMetadata)
{
Console.WriteLine("MetadataException: {0}",
exceptionMetadata.Message);
}
catch (System.Data.MappingException exceptionMapping)
{
Console.WriteLine("MappingException: {0}",
exceptionMapping.Message);
}
}
public static void GetFunctionsFromModel(MetadataWorkspace workspace,
DataSpace model, string functionName, string namespaceName)
{
// Get a collection of EdmFunctions by using the
// specified function name, the namespace name and the model.
ReadOnlyCollection<EdmFunction> functions =
workspace.GetFunctions(
functionName, namespaceName,
model);
// Iterate through the collection to get each function.
foreach (EdmFunction function in functions)
{
Console.WriteLine("\nFunction Name: {0}",
function.FullName);
// Check whether the current function
// has any parameter.
if (function.Parameters.Count != 0)
{
Console.Write("Parameters: ");
// Iterate through the collection to get
// each function parameter.
foreach (FunctionParameter parameter in
function.Parameters)
{
Console.WriteLine(
"\t Parameter Name: {0}",
parameter.Name);
}
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm
Imports System.Collections.ObjectModel
Class GetFunctionsExample
Public Shared Sub Main()
Try
' Establish a connection to the underlying data provider by
' using the connection string specified in the config file.
Using connection As EntityConnection = _
New EntityConnection("Name=AdventureWorksEntities")
' Open the conection.
connection.Open()
' Access the metadata workspace.
Dim workspace As MetadataWorkspace = _
connection.GetMetadataWorkspace
' Get functions from the conceptual model.
GetFunctionsFromModel(workspace, DataSpace.CSpace, _
"Count", "Edm")
' Get functions from the storage model.
GetFunctionsFromModel(workspace, DataSpace.SSpace, _
"COUNT", "SqlServer")
End Using
Catch exceptionMetadata As MetadataException
Console.WriteLine("MetadataException: {0}", _
exceptionMetadata.Message)
Catch exceptionMapping As MappingException
Console.WriteLine("MappingException: {0}", _
exceptionMapping.Message)
End Try
End Sub
Public Shared Sub GetFunctionsFromModel( _
ByVal workspace As MetadataWorkspace, ByVal model As DataSpace, _
ByVal functionName As String, ByVal namespaceName As String)
' Get a collection of EdmFunctions by using the
' specified function name, the namespace name and the model.
Dim functions As ReadOnlyCollection(Of EdmFunction) = _
workspace.GetFunctions(functionName, namespaceName, model)
' Iterate through the collection to get each function.
Dim functionEdm As EdmFunction
For Each functionEdm In functions
Console.WriteLine(ControlChars.Lf & "Function Name: {0}", _
functionEdm.FullName)
' Check whether the current function
' has any parameter.
If (functionEdm.Parameters.Count <> 0) Then
Console.Write("Parameters: ")
' Iterate through the collection to get
' each function parameter.
Dim parameter As FunctionParameter
For Each parameter In functionEdm.Parameters
Console.WriteLine(ControlChars.Tab & _
" Parameter Name: {0}", parameter.Name)
Next
End If
Next
End Sub
End Class