Compartir vía


Cómo: Almacenar y reutilizar consultas

Cuando tiene una aplicación que ejecuta consultas estructuralesmente similares muchas veces, a menudo puede aumentar el rendimiento mediante la compilación de la consulta una vez y su ejecución varias veces con distintos parámetros. Por ejemplo, una aplicación podría tener que recuperar todos los clientes que se encuentran en una ciudad determinada, donde el usuario especifica la ciudad en tiempo de ejecución en un formulario. LINQ to SQL admite el uso de consultas compiladas para este propósito.

Nota:

Este patrón de uso representa el uso más común para las consultas compiladas. Otros enfoques son posibles. Por ejemplo, las consultas compiladas se pueden almacenar como miembros estáticos en una clase parcial que extiende el código generado por el diseñador.

Ejemplo 1

En muchos escenarios, es posible que quiera reutilizar las consultas a través de los límites de los hilos. En tales casos, almacenar las consultas compiladas en variables estáticas es especialmente eficaz. En el ejemplo de código siguiente se supone una clase Queries diseñada para almacenar consultas compiladas y una clase Northwind que representa un tipo fuertemente tipado 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

Ejemplo 2

Actualmente no se pueden almacenar (en variables estáticas) consultas que devuelven un tipo anónimo, ya que el tipo no tiene nombre para proporcionar como argumento genérico. En el ejemplo siguiente se muestra cómo puede solucionar el problema mediante la creación de un tipo que pueda representar el resultado y, a continuación, usarlo como argumento genérico.

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

Consulte también