CLR 方法调用和函数映射

实体框架提供了一组规范函数(如字符串操作函数和数学函数),这些函数可以实现很多数据库系统通用的功能。这使开发人员可以面向广泛的数据库系统。通过查询技术(如 LINQ to Entities)调用时,这些规范函数将转换为要使用的提供程序的相应正确存储区函数。这样,可以用一种数据源通用的形式表示函数调用,从而在数据源之间提供一致的查询体验。如果操作数是数值类型,则按位 AND、OR、NOT 和 XOR 运算符也将映射到规范函数。对于布尔操作数,按位 AND、OR、NOT 和 XOR 运算符将计算其操作数的逻辑 AND、OR、NOT 和 XOR 运算。有关更多信息,请参见规范函数 (Entity SQL)

对于 LINQ 方案,对实体框架执行的查询涉及通过规范函数将某些 CLR 方法映射到基础数据源的方法。LINQ to Entities 查询中未显式映射到规范函数的任何方法调用都会导致引发运行时 NotSupportedException 异常。有关映射到规范函数的 CLR 方法的列表,请参见规范函数映射的 CLR 方法

下面的示例查询位于 Algiers 驱动器中的地址。该查询中的 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 进行查询