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.
Expresiones de consulta
Las expresiones de consulta usan una sintaxis declarativa similar a SQL o XQuery para consultar sobre System.Collections.Generic.IEnumerable<T> colecciones. En tiempo de compilación, el compilador convierte la sintaxis de consulta en llamadas de método a la implementación del proveedor LINQ de los métodos de consulta estándar. Las aplicaciones controlan los operadores de consulta estándar que están dentro del alcance especificando el espacio de nombres adecuado con la directiva using. La siguiente expresión de consulta toma una matriz de cadenas, las agrupa según el primer carácter de la cadena y ordena los grupos.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
Variables con tipo implícito (var)
Puede usar el modificador var para indicar al compilador que infiera y asigne el tipo, como se muestra aquí:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
Las variables declaradas como var están fuertemente tipadas, como las variables cuyo tipo se especifica explícitamente. El uso var permite crear tipos anónimos, pero solo para variables locales. Para obtener más información, vea Variables locales con tipo implícito.
Inicializadores de objeto y colección
Los inicializadores de objeto y colección permiten inicializar objetos sin llamar explícitamente a un constructor para el objeto. Normalmente, se usan inicializadores en expresiones de consulta cuando proyectan los datos de origen en un nuevo tipo de datos. Suponiendo que una clase llamada Customer con propiedades Name y Phone públicas, puede usar el inicializador de objeto como en el código siguiente:
var cust = new Customer { Name = "Mike", Phone = "555-1212" };
Continuando con tu clase Customer, supón que hay un origen de datos denominado IncomingOrders y que para cada pedido con un gran OrderSize, quieres crear un nuevo Customer basado en ese pedido. Puede ejecutar una consulta LINQ en este origen de datos y usar la inicialización de objetos para rellenar una colección:
var newLargeOrderCustomers = from o in IncomingOrders
where o.OrderSize > 5
select new Customer { Name = o.Name, Phone = o.Phone };
Es posible que el origen de datos tenga más propiedades definidas que la clase Customer, como OrderSize, pero con la inicialización de objetos, los datos devueltos de la consulta se moldean en el tipo de datos deseado; eliges los datos relevantes para tu clase. Como resultado, ahora tienes un System.Collections.Generic.IEnumerable<T> lleno de los nuevos elementos Customer que querías. También puede escribir el ejemplo anterior en la sintaxis del método de LINQ:
var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });
A partir de C# 12, puede usar una expresión de colección para inicializar una colección.
Para obtener más información, consulte:
- Inicializadores de objeto y colección
- Sintaxis de expresiones de consulta para operadores de consulta estándar
Tipos anónimos
El compilador crea un tipo anónimo. Solo el compilador puede tener acceso al nombre de tipo. Los tipos anónimos proporcionan una manera cómoda de agrupar temporalmente un conjunto de propiedades en un resultado de consulta sin tener que definir un tipo con nombre independiente. Inicializa tipos anónimos con una nueva expresión y un inicializador de objeto, como se muestra aquí:
select new {name = cust.Name, phone = cust.Phone};
A partir de C# 7, puede usar tuplas para crear tipos sin nombre.
Miembros de extensión
Un miembro de extensión es un miembro estático de una clase estática asociada a un tipo denominado tipo receptor. Puede llamar a un miembro de extensión como si fuera un miembro del tipo receptor. Esta característica permite "agregar" nuevos miembros a los tipos existentes sin modificarlos realmente. Los operadores de consulta estándar son un conjunto de métodos de extensión que proporcionan funcionalidad de consulta LINQ para cualquier tipo que implemente IEnumerable<T>.
Expresiones lambda
Una expresión lambda es una función insertada que usa el => operador para separar los parámetros de entrada del cuerpo de la función y se puede convertir en tiempo de compilación en un delegado o en un árbol de expresiones. En la programación LINQ, se producen expresiones lambda al realizar llamadas de método directo a los operadores de consulta estándar.
Expresiones como datos
Los objetos de consulta se pueden componer, lo que significa que puede devolver una consulta desde un método . Los objetos que representan consultas no almacenan la colección resultante, sino los pasos para generar los resultados cuando sea necesario. La ventaja de devolver objetos de consulta desde métodos es que puedes componerlos o modificarlos más. Por lo tanto, cualquier valor devuelto o out parámetro de un método que devuelva una consulta también debe tener ese tipo. Si un método materializa una consulta en un tipo List<T> o Array concreto, devuelve los resultados de la consulta en lugar de la propia consulta. Todavía puede redactar o modificar una variable de consulta que se devuelve desde un método .
En el ejemplo siguiente, el primer método QueryMethod1 devuelve una consulta como un valor devuelto y el segundo método QueryMethod2 devuelve una consulta como parámetro out (returnQ en el ejemplo). En ambos casos, es una consulta que se devuelve, no los resultados de la consulta.
IEnumerable<string> QueryMethod1(int[] ints) =>
from i in ints
where i > 4
select i.ToString();
void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
returnQ = from i in ints
where i < 4
select i.ToString();
int[] nums = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
var myQuery1 = QueryMethod1(nums);
El siguiente foreach bucle ejecuta la consulta myQuery1.
foreach (var s in myQuery1)
{
Console.WriteLine(s);
}
Reste el puntero del mouse sobre myQuery1 para ver su tipo.
También puede ejecutar la consulta devuelta desde QueryMethod1 directamente, sin usar myQuery1.
foreach (var s in QueryMethod1(nums))
{
Console.WriteLine(s);
}
Reste el puntero del mouse sobre la llamada a QueryMethod1 para ver su tipo de valor devuelto.
QueryMethod2 devuelve una consulta como el valor de su out parámetro:
QueryMethod2(nums, out IEnumerable<string> myQuery2);
// Execute the returned query.
foreach (var s in myQuery2)
{
Console.WriteLine(s);
}
Puede modificar una consulta mediante la composición de la consulta. En este caso, el objeto de consulta anterior se usa para crear un nuevo objeto de consulta. Este nuevo objeto devuelve resultados diferentes a los del objeto de consulta original.
myQuery1 = from item in myQuery1
orderby item descending
select item;
// Execute the modified query.
Console.WriteLine("\nResults of executing modified myQuery1:");
foreach (var s in myQuery1)
{
Console.WriteLine(s);
}