Sdílet prostřednictvím


Postupy: Uložení a opakované použití dotazů

Pokud máte aplikaci, která provádí strukturální podobné dotazy mnohokrát, můžete často zvýšit výkon tím, že dotaz jednou kompilujete a několikrát ho spustíte s různými parametry. Aplikace může například muset načíst všechny zákazníky, kteří jsou v určitém městě, kde je město určeno za běhu uživatelem ve formuláři. LINQ to SQL podporuje použití kompilovaných dotazů pro tento účel.

Poznámka:

Tento způsob použití představuje nejběžnější použití pro kompilované dotazy. Další přístupy jsou možné. Kompilované dotazy mohou být například uloženy jako statické členy v částečné třídě, která rozšiřuje kód vygenerovaný návrhářem.

Příklad 1

V mnoha scénářích můžete chtít znovu použít dotazy napříč hranicemi vlákna. V takových případech je ukládání kompilovaných dotazů do statických proměnných obzvláště efektivní. Následující příklad kódu předpokládá třídu navrženou Queries pro ukládání kompilovaných dotazů a předpokládá Northwind třídy, která představuje silně typd 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

Příklad 2

V současné době nelze ukládat dotazy (ve statických proměnných), které vracejí anonymní typ, protože typ nemá žádný název, který by bylo možné zadat jako obecný argument. Následující příklad ukazuje, jak můžete problém obejít vytvořením typu, který může představovat výsledek, a pak ho použít jako obecný 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

Viz také