Introduccion a solicitudes de datos con Microsoft Entity Framework
Autor: Reynaldo Navedo
Publicado:
Microsoft Entity Framework (EF) es un ORM (Object-Relational Mapping) que simplifica las operaciones con bases de datos en aplicaciones .NET al presentarlas como objetos C#. A continuación, te mostraré cómo puedes utilizar Entity Framework para crear consultas (queries) desde las más simples hasta las más complejas.
1. Configuración Inicial (DbContext y Modelos)
Primero, necesitas tener configurado un DbContext
, el cual es el puente entre tu base de datos y tus clases C#. A continuación te muestro un ejemplo básico de cómo estructurar tu modelo y tu DbContext
:
// Modelo public class Producto { public int ProductoId { get; set; } public string Nombre { get; set; } public decimal Precio { get; set; } } // DbContext public class TiendaContext : DbContext { public DbSet<Producto> Productos { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=mi_servidor;Database=mi_base_de_datos;Trusted_Connection=True;"); } }
Una vez que tengas el contexto y las entidades configuradas, puedes empezar a usar EF para realizar consultas a la base de datos.
2. Consultas Simples
Seleccionar todos los registros de una tabla
using (var context = new TiendaContext()) { var productos = context.Productos.ToList(); foreach (var producto in productos) { Console.WriteLine($"{producto.ProductoId}: {producto.Nombre} - ${producto.Precio}"); } }
Esta consulta obtiene todos los registros de la tabla Productos
.
Filtrar con Where
Puedes filtrar los resultados utilizando Where
:
using (var context = new TiendaContext()) { var productosBaratos = context.Productos .Where(p => p.Precio < 100) .ToList(); foreach (var producto in productosBaratos) { Console.WriteLine($"{producto.Nombre} cuesta menos de $100."); } }
Este ejemplo filtra solo los productos cuyo precio sea menor de 100.
3. Consultas Más Complejas
Ordenar los resultados
Si deseas ordenar los resultados de tu consulta (por ejemplo, ascendiendo el precio):
using (var context = new TiendaContext()) { var productosOrdenados = context.Productos .OrderBy(p => p.Precio) .ToList(); foreach (var producto in productosOrdenados) { Console.WriteLine($"{producto.Nombre}: ${producto.Precio}"); } }
Seleccionar solo ciertas columnas
A veces, podrías no necesitar todas las propiedades de tu modelo:
using (var context = new TiendaContext()) { var nombresDeProductos = context.Productos .Select(p => new { p.Nombre, p.Precio }) .ToList(); foreach (var producto in nombresDeProductos) { Console.WriteLine($"{producto.Nombre}: ${producto.Precio}"); } }
Paginación
Si tu tabla tiene muchos registros, podrías limitar cuántos se devuelven:
using (var context = new TiendaContext()) { var productosPaginados = context.Productos .OrderBy(p => p.ProductoId) .Skip(0) // Saltar los primeros `x` elementos, en este caso 0 .Take(10) // Tomar solo 10 elementos .ToList(); foreach (var producto in productosPaginados) { Console.WriteLine($"{producto.Nombre}: ${producto.Precio}"); } }
Incluyendo relaciones (Eager Loading)
Cuando tienes tablas relacionadas, por ejemplo, Producto
y Categoria
, puedes cargar datos relacionados usando Include
:
public class Categoria { public int CategoriaId { get; set; } public string Nombre { get; set; } public List<Producto> Productos { get; set; } } // Imaginemos que tenemos una relación Producto-Categoria y queremos incluirla en la consulta: using (var context = new TiendaContext()) { var productosConCategoria = context.Productos .Include(p => p.Categoria) // Eager loading de la categoría .ToList(); foreach (var producto in productosConCategoria) { Console.WriteLine($"{producto.Nombre} pertenece a la categoria: {producto.Categoria.Nombre}"); } }
4. Consultas Complejas (JOIN e INNER QUERIES)
Realizando JOINs con LINQ
Si tienes más de una tabla relacionada y quieres hacer consultas como un "JOIN":
var productosConCategoria = from p in context.Productos join c in context.Categorias on p.CategoriaId equals c.CategoriaId select new { ProductoNombre = p.Nombre, CategoriaNombre = c.Nombre }; foreach (var item in productosConCategoria) { Console.WriteLine($"{item.ProductoNombre} pertenece a {item.CategoriaNombre}"); }
Este es un ejemplo de cómo hacer un JOIN
clásico entre las tablas Productos
y Categorias
.
5. Consultas con funciones agregadas
Puedes aplicar funciones como Sum
, Count
, Avg
, etc., usando LINQ:
Calcular el total de productos
var totalProductos = context.Productos.Count(); Console.WriteLine($"Total de productos: {totalProductos}");
Sumar los precios de todos los productos
var totalPrecios = context.Productos.Sum(p => p.Precio); Console.WriteLine($"Suma de todos los precios: ${totalPrecios}");
Precio promedio de los productos
var precioPromedio = context.Productos.Average(p => p.Precio); Console.WriteLine($"El precio promedio de los productos es: ${precioPromedio}");
Conclusión
Microsoft Entity Framework ofrece una forma sencilla de trabajar con bases de datos SQL utilizando tu código C#. Desde obtener los registros de una tabla hasta realizar consultas complejas con JOINs o subconsultas, EF te permite hacer todo esto de una manera muy intuitiva y segura. Pendiente a mi canal de YouTube para videos y tutoriales relacionados.