Практическое руководство. Вызов функций базы данных
Класс SqlFunctions содержит методы среды CLR, предоставляющие доступ к функциям SQL Server для использования в запросах LINQ to Entities. При использовании методов SqlFunctions в запросах LINQ to Entities в базе данных выполняются соответствующие функции базы данных.
Примечание.
Функции базы данных, которые производят вычисление по ряду значений и возвращают одиночное значение (известные также как статистические функции баз данных), могут вызываться напрямую. Другие канонические функции могут вызываться только в составе запроса LINQ to Entities. Чтобы вызвать агрегатную функцию напрямую, ей необходимо передать экземпляр ObjectQuery<T>. Дополнительные сведения см. в приведенном ниже втором примере.
Примечание.
Методы класса SqlFunctions поддерживаются только в функциях SQL Server. Аналогичные классы, предоставляющие функции баз данных, могут быть доступны в других поставщиках.
Пример 1
В следующем примере используется модель AdventureWorks Sales. В примере выполняется запрос LINQ to Entities, в котором с помощью метода CharIndex возвращаются все контакты, в которых фамилия начинается с «Si»:
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
// SqlFunctions.CharIndex is executed in the database.
var contacts = from c in AWEntities.Contacts
where SqlFunctions.CharIndex("Si", c.LastName) == 1
select c;
foreach (var contact in contacts)
{
Console.WriteLine(contact.LastName);
}
}
Using AWEntities As New AdventureWorksEntities()
' SqlFunctions.CharIndex is executed in the database.
Dim contacts = From c In AWEntities.Contacts _
Where SqlFunctions.CharIndex("Si", c.LastName) = 1 _
Select c
For Each contact In contacts
Console.WriteLine(contact.LastName)
Next
End Using
Пример 2
В следующем примере используется модель AdventureWorks Sales. В примере напрямую вызывается статистический метод ChecksumAggregate. Обратите внимание, что в функцию передается экземпляр ObjectQuery<T>, что позволяет вызывать ее, хотя она и не входит в состав запроса LINQ to Entities.
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
// SqlFunctions.ChecksumAggregate is executed in the database.
decimal? checkSum = SqlFunctions.ChecksumAggregate(
from o in AWEntities.SalesOrderHeaders
select o.SalesOrderID);
Console.WriteLine(checkSum);
}
Using AWEntities As New AdventureWorksEntities()
' SqlFunctions.ChecksumAggregate is executed in the database.
Dim checkSum As Integer = SqlFunctions.ChecksumAggregate( _
From o In AWEntities.SalesOrderHeaders _
Select o.SalesOrderID)
Console.WriteLine(checkSum)
End Using