Nasıl yapılır: Sorguları Depolama ve Yeniden Kullanma
Yapısal olarak benzer sorguları birçok kez yürüten bir uygulamanız olduğunda, genellikle sorguyu bir kez derleyip farklı parametrelerle birkaç kez yürüterek performansı artırabilirsiniz. Örneğin, bir uygulamanın belirli bir şehirde bulunan ve şehrin kullanıcı tarafından formda çalışma zamanında belirtildiği tüm müşterileri alması gerekebilir. LINQ to SQL bu amaçla derlenmiş sorguların kullanımını destekler.
Not
Bu kullanım düzeni, derlenmiş sorgular için en yaygın kullanımı temsil eder. Diğer yaklaşımlar da mümkündür. Örneğin, derlenmiş sorgular tasarımcı tarafından oluşturulan kodu genişleten kısmi bir sınıfta statik üyeler olarak depolanabilir.
Örnek 1
Birçok senaryoda sorguları iş parçacığı sınırları boyunca yeniden kullanmak isteyebilirsiniz. Bu gibi durumlarda, derlenmiş sorguların statik değişkenlerde depolanması özellikle etkilidir. Aşağıdaki kod örneğinde, derlenmiş sorguları depolamak için tasarlanmış bir Queries
sınıf varsayılır ve kesin olarak yazılan bir öğesini temsil eden bir Northwind sınıfı varsayılır 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
Örnek 2
Türün genel bağımsız değişken olarak sağlayabilecek bir adı olmadığından anonim bir tür döndüren sorguları şu anda depolayamazsınız (statik değişkenlerde). Aşağıdaki örnekte, sonucu temsil eden bir tür oluşturup bunu genel bağımsız değişken olarak kullanarak sorunu nasıl çözebileceğiniz gösterilmektedir.
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