LINQ => Language-Integrated Query
- Se trata de un conjunto de tecnologías para poder expresar en lenguaje c# consultas desde diferentes orígenes de datos.
- Más información aquí: https://docs.microsoft.com/es-es/dotnet/csharp/tutorials/working-with-linq
Todas las operaciones de consulta LINQ constan de tres acciones distintas:
1.- Obtener el origen de datos.
2.- Crear la consulta.
3.- Ejecutar la consulta.
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
//Otra forma de hacer la consulta
var query = numbers.Where(num => num % 2 == 0);
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
La cláusula from especifica el origen de datos, la cláusula where aplica el filtro y la cláusula select especifica el tipo de los elementos devueltos.
// utilizando el lenguaje de consultas de Linq:
var conLenguajeDeConsultas = from producto in _productos
orderby producto.Precio descending // si quisiera ordenar de forma ascendente usamos el keyword 'ascending'
select producto;
// utilizando el lenguaje de consultas de Linq:
var conMetodos = _productos.OrderByDescending(producto => producto.Precio); // si quisiera ordenar de forma ascendente usamos el método 'OrderBy()'
documentacion: https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/concepts/linq/type-relationships-in-linq-query-operations
doc: https://www.campusmvp.es/recursos/post/introduccion-rapida-a-linq-con-c-sharp.aspx
Esta extensión nos va a permitir obtener respectivamente el primer y el último objeto de la colección. Esto es especialmente útil si la colección está ordenada.
var primero = alumnos.First();
var ultimo = alumnos.Last();
nos va a permitir sumar la colección
var sumaNotas = alumnos.Sum(x => x.Nota);
obtener los valores máximo y mínimo de la colección
var notaMaxima = alumnos.Max(x => x.Nota);
var notaMinima = alumnos.Min(x => x.Nota);
Este método nos va a devolver la media aritmética de los valores (numéricos) de los elementos que le indiquemos de la colección
var media = alumnos.Average(x => x.Nota);
var usuario = _context.Usuarios.FindAsync(id);
Con este último operador, vamos a poder comprobar si todos o alguno de los valores de la colección cumplen el criterio que le indiquemos
var todosAprobados = alumnos.All(x => x.Nota >= 5);
var algunAprobado = alumnos.Any(x => x.Nota >= 5);
var usuario = _context.Usuarios.FirstOrDefaultAsync(m => m.Id == id);
var funciones = _context.Funciones.Where(f => f.Pelicula.PeliculaId == model.PeliculaId)
.Where(f => f.ButacasDisponibles >= model.cantButacas)
.Where(f => f.Fecha >= DateTime.Today && f.Fecha < model.Fecha)
.Where(f => f.Confirmada == true)
.Select(p => new MostrarFuncionesVM()
{ FuncionId = p.FuncionId,
Fecha = p.Fecha,
Hora = p.Hora,
cantButacas = model.cantButacas,
Titulo = p.Pelicula.Titulo,
Sala = p.Sala.Numero,
tipoSala = p.Sala.TipoSala.Nombre
});
reservas = _context.Reservas.Include(r => r.Cliente).Include(r => r.Funcion).Include(r => r.Funcion.Pelicula).ToList();
var reservas = _context.Reservas.Where(r => r.Funcion.PeliculaId == model.PeliculaId)
.Where(r => r.Funcion.Fecha >= model.Desde)
.Where(r => r.Funcion.Fecha <= model.Hasta)
.Include(r => r.Funcion.Sala.TipoSala).ToList();
var pelicula = await _context.Peliculas.Include(p => p.Genero).FirstOrDefaultAsync(m => m.PeliculaId == id);