Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli masz aplikację, która wykonuje zapytania strukturalnie podobne wiele razy, często można zwiększyć wydajność, kompilując zapytanie jednorazowo i wykonując je kilka razy z różnymi parametrami. Na przykład aplikacja może potrzebować pobrania wszystkich klientów, którzy znajdują się w określonym mieście, które użytkownik określa w formularzu w czasie wykonywania. LINQ to SQL obsługuje w tym celu użycie skompilowanych zapytań .
Uwaga / Notatka
Ten wzorzec użycia reprezentuje najbardziej typowe zastosowanie dla skompilowanych zapytań. Możliwe są inne podejścia. Na przykład skompilowane zapytania mogą być przechowywane jako statyczne elementy członkowskie w klasie częściowej, która rozszerza kod wygenerowany przez projektanta.
Przykład 1
W wielu scenariuszach możesz chcieć ponownie używać zapytań w granicach wątków. W takich przypadkach przechowywanie skompilowanych zapytań w zmiennych statycznych jest szczególnie skuteczne. W poniższym przykładzie kodu przyjęto, że istnieje klasa zaprojektowana do przechowywania skompilowanych zapytań oraz klasa Queries Northwind, która reprezentuje silnie typizowany DataContextelement.
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
Przykład 2
Obecnie nie można przechowywać (w zmiennych statycznych) zapytań, które zwracają typ anonimowy, ponieważ typ nie ma nazwy do podania jako argumentu ogólnego. W poniższym przykładzie pokazano, jak można obejść problem, tworząc typ, który może reprezentować wynik, a następnie użyj go jako argumentu ogólnego.
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