Funciones y parámetros de función (metadatos)
Las funciones son rutinas que realizan una acción y devuelven el resultado de esa acción como un valor. El espacio de nombres System.Data.Metadata.Edm proporciona clases para exponer las funciones canónicas definidas en las funciones específicas del almacenamiento y de Entity Framework que se definen en la base de datos o en el proveedor de almacenamiento subyacente.
Las funciones canónicas se definen en el modelo conceptual en Entity Framework. Estas funciones reflejan las funciones específicas del almacenamiento que se usan con más frecuencia. Por ejemplo, hay una función que se denomina Edm.Max en el modelo conceptual y SqlServer.Max en el modelo de almacenamiento. Cuando las funciones canónicas se usan en una consulta de Entity SQL, la función apropiada se llama en el proveedor de almacenamiento. Para obtener más información acerca de las funciones canónicas en Entity Framework, vea Funciones canónicas (Entity SQL).
Puede usar la clase EdmFunction para recuperar información acerca de las funciones canónicas definidas en el modelo conceptual y las definidas en el modelo de almacenamiento o en el proveedor de almacenamiento subyacente.
El método System.Data.Metadata.Edm.MetadataWorkspace.GetFunctions(System.String,System.String,System.String) también permite recuperar todas las sobrecargas de una función concreta.
En el ejemplo de código siguiente se muestra cómo obtener un área de trabajo de metadatos desde la conexión que después se usa para recuperar información acerca de las funciones canónicas Count del modelo conceptual y las funciones COUNT que proporciona el proveedor de almacenamiento subyacente en el modelo de almacenamiento. Observe que el área de trabajo de metadatos proporciona compatibilidad para recuperar los metadatos como un servicio en tiempo de ejecución.
En el ejemplo de código se usa la cadena de configuración de la aplicación que se especifica en Usar el modelo de objetos de AdventureWorks (EDM) para conectar con la base de datos de 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