Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie über eine Anwendung verfügen, die strukturell ähnliche Abfragen mehrmals ausführt, können Sie häufig die Leistung steigern, indem Sie die Abfrage einmal kompilieren und mehrmals mit verschiedenen Parametern ausführen. Beispielsweise muss eine Anwendung möglicherweise alle Kunden abrufen, die sich in einer bestimmten Stadt befinden, in der die Stadt zur Laufzeit vom Benutzer in einem Formular angegeben wird. LINQ to SQL unterstützt die Verwendung kompilierter Abfragen für diesen Zweck.
Hinweis
Dieses Verwendungsmuster stellt die am häufigsten verwendete Verwendung für kompilierte Abfragen dar. Andere Ansätze sind möglich. Kompilierte Abfragen können z. B. als statische Member in einer partiellen Klasse gespeichert werden, die den vom Designer generierten Code erweitert.
Beispiel 1
In vielen Szenarien möchten Sie die Abfragen möglicherweise über Threadgrenzen hinweg wiederverwenden. In solchen Fällen ist das Speichern der kompilierten Abfragen in statischen Variablen besonders effektiv. Im folgenden Codebeispiel wird angenommen, dass eine Queries Klasse kompilierte Abfragen speichert und eine Northwind-Klasse eine stark typisierte DataContextKlasse darstellt.
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
Beispiel 2
Abfragen, die einen anonymen Typ zurückgeben, können zurzeit nicht gespeichert werden, da der Typ keinen Namen hat, der als generisches Argument bereitgestellt werden soll. Das folgende Beispiel zeigt, wie Sie das Problem umgehen können, indem Sie einen Typ erstellen, der das Ergebnis darstellen kann, und dann als generisches Argument verwenden.
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