Procedimientos: Llamada a funciones definidas por el modelo en consultas

En este tema se describe cómo llamar a las funciones definidas en el modelo conceptual desde consultas de LINQ to Entities.

El siguiente procedimiento proporciona un esquema de alto nivel para llamar a una función definida por el modelo desde una consulta de LINQ to Entities. El ejemplo que sigue proporciona más detalles sobre los pasos del procedimiento. El procedimiento da por hecho que se ha definido una función en el modelo conceptual. Para obtener más información, vea Cómo: Definir funciones personalizadas en el modelo conceptual.

Para llamar a una función definida en el modelo conceptual

  1. Agregue un método de Common Language Runtime (CLR) a su aplicación que se corresponda con la función definida en el modelo conceptual. Para asignar el método, debe aplicarle un atributo EdmFunctionAttribute. Tenga en cuenta que los parámetros NamespaceName y FunctionName del atributo son el nombre del espacio de nombres del modelo conceptual y el nombre de la función en el modelo conceptual, respectivamente. La resolución del nombre de la función para LINQ distingue entre mayúsculas y minúsculas.

  2. Llame a la función en una consulta LINQ to Entities.

Ejemplo 1

En el siguiente ejemplo se muestra cómo llamar a una función que se define en el modelo conceptual desde una consulta de LINQ to Entities. En el ejemplo se usa el modelo School. Para obtener información sobre el modelo School, vea Crear la base de datos de ejemplo School y Generar el archivo .edmx de School.

La siguiente función del modelo conceptual devuelve el número de años transcurridos desde que se contrató a un instructor. Para obtener información sobre cómo agregar la función a un modelo conceptual, consulte Procedimientos: Definición de funciones personalizadas en el modelo conceptual.

<Function Name="YearsSince" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

Ejemplo 2

A continuación, agregue el siguiente método a su aplicación y utilice un atributo EdmFunctionAttribute para asignarlo a la función del modelo conceptual:

[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Ejemplo 3

Ahora puede llamar a la función del modelo conceptual desde una consulta de LINQ to Entities. El siguiente código llama al método para mostrar todos los instructores que se contrataron hace más de diez años:

using (SchoolEntities context = new SchoolEntities())
{
    // Retrieve instructors hired more than 10 years ago.
    var instructors = from p in context.People
                      where YearsSince((DateTime)p.HireDate) > 10
                      select p;

    foreach (var instructor in instructors)
    {
        Console.WriteLine(instructor.LastName);
    }
}
Using context As New SchoolEntities()
    ' Retrieve instructors hired more than 10 years ago.
    Dim instructors = From p In context.People _
                      Where YearsSince(CType(p.HireDate, DateTime?)) > 10 _
                      Select p

    For Each instructor In instructors
        Console.WriteLine(instructor.LastName)
    Next
End Using

Consulte también