Partilhar via


Como: Chamar funções de banco de dados

A SqlFunctions classe contém métodos que expõem funções do SQL Server para uso em consultas LINQ to Entities. Quando você usa SqlFunctions métodos em consultas LINQ to Entities, as funções de banco de dados correspondentes são executadas no banco de dados.

Nota

As funções de banco de dados que executam um cálculo em um conjunto de valores e retornam um único valor (também conhecidas como funções de banco de dados agregado) podem ser invocadas diretamente. Outras funções canônicas só podem ser chamadas como parte de uma consulta LINQ to Entities. Para chamar uma função agregada diretamente, você deve passar um ObjectQuery<T> para a função. Para obter mais informações, consulte o segundo exemplo abaixo.

Nota

Os métodos na classe são específicos para funções do SqlFunctions SQL Server. Classes semelhantes que expõem funções de banco de dados podem estar disponíveis por meio de outros provedores.

Exemplo 1

O exemplo a seguir usa o Modelo de Vendas AdventureWorks. O exemplo executa uma consulta LINQ to Entities que usa o CharIndex método para retornar todos os contatos cujo sobrenome começa com "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

Exemplo 2

O exemplo a seguir usa o Modelo de Vendas AdventureWorks. O exemplo chama o método agregado ChecksumAggregate diretamente. Observe que um ObjectQuery<T> é passado para a função, o que permite que ele seja chamado sem fazer parte de uma consulta 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

Consulte também