Cómo: Llamar a una función definida por el usuario (Entity Framework)

Entity SQL permite llamar a funciones definidas por el usuario en una consulta. Estas funciones se pueden definir inline con la consulta o como parte del modelo conceptual. Para obtener más información, vea Funciones definidas por el usuario (Entity SQL).

El ejemplo de este tema se basa en el modelo AdventureWorks Sales. Para ejecutar el código de este tema, debe haber agregado el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para que use Entity Framework. Para obtener más información, vea Cómo: Usar el Asistente para Entity Data Model (Entity Framework) o Cómo: Configurar manualmente un proyecto de Entity Framework y Cómo: Definir manualmente un modelo Entity Data Model (Entity Framework).

Ejemplo

El siguiente ejemplo define una función denominada OrderTotal en una consulta de Entity SQL. Esta función toma un objeto SalesOrderHeader y vuelve a calcular la cantidad total debida agregando los valores de las propiedades SubTotal, TaxAmt y Freight. A continuación, se llama a esta función en la proyección de la consulta para devolver el TotalDue actualizado con el valor TotalDue devuelto del origen de datos. El operador USING es necesario para especificar el espacio de nombres del objeto SalesOrderHeader pasado a la función.

' Query that calls the OrderTotal function to recalculate the order total. 
Dim queryString As String = "USING Microsoft.Samples.Entity;" & _
    " FUNCTION OrderTotal(o SalesOrderHeader) AS (o.SubTotal + o.TaxAmt + o.Freight)" & _
    " SELECT order.TotalDue AS currentTotal, OrderTotal(order) AS calculated" & _
    " FROM AdventureWorksEntities.SalesOrderHeaders AS order WHERE order.Contact.ContactID = @customer"

Dim customerId As Integer = 364


Using context As New AdventureWorksEntities()
    Dim query As New ObjectQuery(Of DbDataRecord)(queryString, context)
    query.Parameters.Add(New ObjectParameter("customer", customerId))

    For Each rec As DbDataRecord In query
        Console.WriteLine("Order Total: Current - {0}, Calculated - {1}.", rec(0), rec(1))
    Next
End Using
// Query that calls the OrderTotal function to recalculate the order total.
string queryString = @"USING Microsoft.Samples.Entity;
    FUNCTION OrderTotal(o SalesOrderHeader) AS
    (o.SubTotal + o.TaxAmt + o.Freight)

    SELECT [order].TotalDue AS currentTotal, OrderTotal([order]) AS calculated
    FROM AdventureWorksEntities.SalesOrderHeaders AS [order]
    WHERE [order].Contact.ContactID = @customer";

int customerId = 364;


using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(queryString, context);
    query.Parameters.Add(new ObjectParameter("customer",customerId));

    foreach (DbDataRecord rec in query)
    {
        Console.WriteLine("Order Total: Current - {0}, Calculated - {1}.", 
            rec[0], rec[1]);
    }
}

Vea también

Tareas

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

Conceptos

Funciones definidas por el usuario (Entity SQL)

Otros recursos

How to: Define Custom Functions in the Conceptual Model
How to: Define Custom Functions in the Conceptual Model