Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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