Dela via


Gör så här: Lagra och återanvända frågor

När du har ett program som kör strukturellt liknande frågor många gånger kan du ofta öka prestandan genom att kompilera frågan en gång och köra den flera gånger med olika parametrar. Ett program kan till exempel behöva hämta alla kunder som befinner sig i en viss stad, där staden anges vid körning av användaren i ett formulär. LINQ till SQL stöder användning av kompilerade frågor för detta ändamål.

Kommentar

Det här användningsmönstret representerar den vanligaste användningen för kompilerade frågor. Andra metoder är möjliga. Kompilerade frågor kan till exempel lagras som statiska medlemmar i en partiell klass som utökar koden som genereras av designern.

Exempel 1

I många scenarier kanske du vill återanvända frågorna över trådgränser. I sådana fall är det särskilt effektivt att lagra de kompilerade frågorna i statiska variabler. I följande kodexempel förutsätts en Queries klass som är utformad för att lagra kompilerade frågor och förutsätter en Northwind-klass som representerar en starkt skriven DataContext.

public static Func<Northwnd, string, IQueryable<Customer>>
    CustomersByCity =
        CompiledQuery.Compile((Northwnd db, string city) =>
            from c in db.Customers where c.City == city select c);

public static Func<Northwnd, string, IQueryable<Customer>>
    CustomersById = CompiledQuery.Compile((Northwnd db,
    string id) => db.Customers.Where(c => c.CustomerID == id));
Class Queries

    Public Shared CustomersByCity As _
        Func(Of Northwnd, String, IQueryable(Of Customer)) = _
            CompiledQuery.Compile(Function(db As Northwnd, _
    city As String) _
        From c In db.Customers Where c.City = city Select c)

    Public Shared CustomersById As _
        Func(Of Northwnd, String, IQueryable(Of Customer)) = _
            CompiledQuery.Compile(Function(db As Northwnd, _
    id As String) _
        db.Customers.Where(Function(c) c.CustomerID = id))

End Class
// The following example invokes such a compiled query in the main
// program.

public IEnumerable<Customer> GetCustomersByCity(string city)
{
    var myDb = GetNorthwind();
    return Queries.CustomersByCity(myDb, city);
}
' The following example invokes such a compiled query in the main
' program
Public Function GetCustomersByCity(ByVal city As String) As _
    IEnumerable(Of Customer)

    Dim myDb = GetNorthwind()
    Return Queries.CustomersByCity(myDb, city)
End Function

Exempel 2

Du kan för närvarande inte lagra (i statiska variabler) frågor som returnerar en anonym typ, eftersom typen inte har något namn att ange som ett allmänt argument. I följande exempel visas hur du kan kringgå problemet genom att skapa en typ som kan representera resultatet och sedan använda det som ett allmänt argument.

class SimpleCustomer
{
    public string ContactName { get; set; }
}

class Queries2
{
    public static Func<Northwnd, string, IEnumerable<SimpleCustomer>> CustomersByCity =
        CompiledQuery.Compile<Northwnd, string, IEnumerable<SimpleCustomer>>(
        (Northwnd db, string city) =>
        from c in db.Customers
        where c.City == city
        select new SimpleCustomer { ContactName = c.ContactName });
}
Class SimpleCustomer
    Private _ContactName As String
    Public Property ContactName() As String
        Get
            Return _ContactName
        End Get
        Set(ByVal value As String)
            _ContactName = value
        End Set
    End Property
End Class

Class Queries2
    Public Shared CustomersByCity As Func(Of Northwnd, String, IEnumerable(Of SimpleCustomer)) = _
        CompiledQuery.Compile(Of Northwnd, String, IEnumerable(Of SimpleCustomer))( _
        Function(db As Northwnd, city As String) _
        From c In db.Customers _
        Where c.City = city _
        Select New SimpleCustomer With {.ContactName = c.ContactName})
End Class

Se även