Share via


Cómo: Llamar a funciones definidas por el modelo en consultas (LINQ to Entities)

En este tema se describe cómo llamar a las funciones definidas en el modelo conceptual desde consultas 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 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 How to: Define Custom Functions in the Conceptual Model.

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

En el siguiente ejemplo se muestra cómo llamar a una función que se define en el modelo conceptual desde una consulta LINQ to Entities . En el ejemplo se usa el modelo School. Para obtener información sobre el modelo School, vea Crear la aplicación de ejemplo School (Tutorial rápido de Entity Framework) y Generar el archivo .edmx de School (Tutorial rápido de Entity Framework).

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, vea How to: Define Custom Functions in the Conceptual Model.

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

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

Ahora puede llamar a la función del modelo conceptual desde una consulta 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 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
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);
    }
}

Vea también

Tareas

Cómo: Llamar a funciones definidas por el modelo como métodos de objeto (LINQ to Entities)

Conceptos

Consultas en LINQ to Entities
Llamar a funciones en consultas de LINQ to Entities

Otros recursos

.edmx File Overview