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