Aracılığıyla paylaş


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

Ayrıca bkz.