Dela via


Gör så här: Anropa databasfunktioner

Klassen SqlFunctions innehåller metoder som gör SQL Server-funktioner tillgängliga för användning i LINQ för entitetsfrågor. När du använder SqlFunctions metoder i LINQ till entitetsfrågor körs motsvarande databasfunktioner i databasen.

Kommentar

Databasfunktioner som utför en beräkning på en uppsättning värden och returnerar ett enda värde (kallas även aggregerade databasfunktioner) kan anropas direkt. Andra kanoniska funktioner kan bara anropas som en del av en LINQ-till-entitetsfråga. Om du vill anropa en aggregeringsfunktion direkt måste du skicka en ObjectQuery<T> till funktionen. Mer information finns i det andra exemplet nedan.

Kommentar

Metoderna i SqlFunctions klassen är specifika för SQL Server-funktioner. Liknande klasser som exponerar databasfunktioner kan vara tillgängliga via andra leverantörer.

Exempel 1

I följande exempel används AdventureWorks-försäljningsmodellen. Exemplet kör en LINQ till entitetsfråga som använder CharIndex metoden för att returnera alla kontakter vars efternamn börjar med "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

Exempel 2

I följande exempel används AdventureWorks-försäljningsmodellen. Exemplet anropar aggregeringsmetoden ChecksumAggregate direkt. Observera att en ObjectQuery<T> skickas till funktionen, vilket gör att den kan anropas utan att vara en del av en LINQ-till-entitetsfråga.

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

Se även