Как вызвать определяемую пользователем функцию (платформа Entity Framework)

Entity SQL позволяет вызывать встроенные определяемые пользователем функции в запросе. Данные функции можно определить в строке кода в запросе или как часть концептуальной модели. Дополнительные сведения см. в разделе Определяемые пользователем функции (Entity SQL).

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном разделе, нужно сначала добавить к проекту модель Adventure Works Sales и настроить его для использования платформы Entity Framework. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (Entity Framework) или Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (Entity Framework).

Пример

В следующем примере определяется функция под названием OrderTotal в запросе Entity SQL. Данная функция берет объект SalesOrderHeader и пересчитывает итоговые суммы путем добавления значений свойств SubTotal, TaxAmt и Freight. После этого функция вызывается в проекции запроса для возвращения пересчитанного значения TotalDue со значением TotalDue из источника данных. Оператор USING необходим для задания пространства имен объектов SalesOrderHeader, переданных функции.

' 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]);
    }
}

См. также

Задачи

Как вызывать определяемые моделью функции в запросах (LINQ to Entities)

Основные понятия

Определяемые пользователем функции (Entity SQL)

Другие ресурсы

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