Поделиться через


Сопоставление методов CLR с функциями

Платформа Entity Framework предоставляет набор канонических функций, которые реализуют операции над строками, математические функции и другую общую функциональность для многих систем баз данных. Это позволяет разработчикам работать с широким кругом систем баз данных. При вызове из технологии запросов (например, из LINQ to Entities) канонические функции преобразуются в соответствующую функцию хранилища для используемого поставщика. Это позволяет для различных источников данных выражать вызовы функций в общей форме, обеспечивая согласованность при применении запросов. Побитовые операторы AND, OR, NOT и XOR также сопоставляются с каноническими функциями, если операнд имеет числовой тип. Для операндов типа Boolean побитовые операторы AND, OR, NOT и XOR выполняют соответствующие логические операции. Дополнительные сведения см. в разделе Канонические функции (язык Entity SQL).

Для сценариев LINQ запросы к платформе Entity Framework включают сопоставление определенных методов CLR с методами базового источника данных через канонические функции. Любой вызов метода в запросе LINQ to Entities, который явно не сопоставлен с канонической функцией, приведет к активизации исключения времени выполнения NotSupportedException. Список методов CLR, сопоставленных с каноническими функциями, см. в разделе Сопоставление методов CLR с каноническими функциями.

Ниже приведен пример запроса к адресам, находящимся на улице Algiers Drive. Вызов метода Contains сопоставляется в запросе с канонической функцией IndexOf.

Using AWEntities As New AdventureWorksEntities()
    Dim addresses As ObjectQuery(Of Address) = AWEntities.Address

    Dim query = _
    From address In addresses _
    Where address.AddressLine1.Contains("Algiers Dr.") _
    Select address

    For Each algiersAddress As Address In query
        Console.WriteLine("Address 1: " + algiersAddress.AddressLine1)
    Next

End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    ObjectQuery<Address> addresses = AWEntities.Address;

    IQueryable<Address> query = from address in addresses
                                where address.AddressLine1.Contains("Algiers Dr.")
                                select address;

    // Addresses on Algiers Dr.
    foreach (Address algiersAddress in query)
    {
        Console.WriteLine("Address 1: " + algiersAddress.AddressLine1);
    }
}

См. также

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

Канонические функции (язык Entity SQL)

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

Выполнение запросов с помощью LINQ to Entities