En este post quiero platicar de tres características del .NET Framework disponibles desde su versión 3.5 allá por el año 2007:
Son métodos de extensión que nos permite realizar consultas, filtrado y muchas otras funcionalidades bastante parecido a como lo haríamos haciendo consultas sql en un manejador de bases de datos, incluso la sintáxis es bastante parecida.
LinqToEntities
Fue desarrollado para interactuar con Entity Framework, que sirve para interactuar de manera estandarizada con diferentes motores de bases de datos, en el que existe una clase de contexto y usándola podemos hacer consultas complejas al manejador de base de datos de manera simple usando código .NET.
Tipos Anónimos
A diferencia de los tipos dinámicos, son tipos estáticos fuertemente tipados que se validan en tiempo de compilación que nos permite crear objetos que no están basados en una clase, pero que nos ofrece una funcionalidad bastante útil a la hora de trabajar con linq.
Veamos 5 Ejemplos en los que intentamos ejemplificar los conceptos antes mencionados.
Definición de Entidades
internal class TiposImágenes
{
public int Clave { get; set; }
public string Descripción { get; set; }
}
internal class Imagen
{
public int Clave { get; set; }
public int TipoImagen { get; set; }
public string Ruta { get; set; }
public string Nombre { get; set; }
}
Llenado de Listas de Ejemplo
private static List<TiposImágenes> CargarTiposImágenes()
{
List<TiposImágenes> tiposImágenes = new List<TiposImágenes>();
tiposImágenes.Add(new TiposImágenes() {
Clave = 1,
Descripción = "Documento de Identidad"
});
tiposImágenes.Add(new TiposImágenes() {
Clave = 2,
Descripción = "Comprobante de Domicilio"
});
tiposImágenes.Add(new TiposImágenes() {
Clave = 3,
Descripción = "Comprobante de Ingresos"
});
return tiposImágenes;
}
private static List<Imagen> CargarImágenes()
{
List<Imagen> imágenes = new List<Imagen>();
imágenes.Add(new Imagen() {
Clave = 1,
TipoImagen = 1,
Ruta = "C:\\Imágenes",
Nombre = "Imagen1.jpg"
});
imágenes.Add(new Imagen() {
Clave = 2,
TipoImagen = 2,
Ruta = "C:\\Imágenes",
Nombre = "Imagen2.jpg"
});
imágenes.Add(new Imagen() {
Clave = 3,
TipoImagen = 2,
Ruta = "C:\\Imágenes",
Nombre = "Imagen3.jpg"
});
imágenes.Add(new Imagen() {
Clave = 4,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen4.jpg"
});
imágenes.Add(new Imagen() {
Clave = 5,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen5.jpg"
});
imágenes.Add(new Imagen() {
Clave = 6,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen6.jpg"
});
return imágenes;
}
Ejemplo # 1. Imágenes en Carpeta 1
List<Imagen> filtrada = imágenes.Where(i => i.TipoImagen.Equals(1)).ToList();
foreach (Imagen imagen in filtrada)
{
Console.WriteLine("{0} {1}", imagen.Clave, imagen.Nombre);
}
Ejemplo # 2. Imágenes en Carpetas 1 y 2
var imágenesFiltradas = imágenes.Where(i => i.TipoImagen.Equals(1) || i.TipoImagen.Equals(2)).
Select(i => new{
TipoDocumento = tiposImágenes.
Where(ti => ti.Clave.Equals(i.TipoImagen)).FirstOrDefault().Descripción,
Imagen = Path.Combine(i.Ruta, i.Nombre)
});
foreach (var imagen in imágenesFiltradas)
{
Console.WriteLine("Tipo de Documento: {0}, Imagen: {1}",
imagen.TipoDocumento, imagen.Imagen);
}
Ejemplo # 3. Imágenes en Carpetas 2 y 3
int[] tiposImágenesFiltrar = new int[] { 2, 3 };
imágenesFiltradas = imágenes.Where(i => tiposImágenesFiltrar.Contains(i.TipoImagen)).
Select(i => new
{
TipoDocumento = tiposImágenes.
Where(ti => ti.Clave.Equals(i.TipoImagen)).FirstOrDefault().Descripción,
Imagen = Path.Combine(i.Ruta, i.Nombre)
});
foreach (var imagen in imágenesFiltradas)
{
Console.WriteLine("Tipo de Documento: {0}, Imagen: {1}",
imagen.TipoDocumento, imagen.Imagen);
}
Ejemplo # 4. Número de Imágenes Por Carpeta
var count = imágenes.GroupBy(i => i.TipoImagen).Select(i => new {
key = tiposImágenes.Where(ti => ti.Clave.Equals(i.Key)).FirstOrDefault().Descripción,
Count = i.Count()
});
foreach (var carpeta in count)
{
Console.WriteLine("Carpeta: {0}, Cantidad de Imágenes: {1}", carpeta.key, carpeta.Count);
}
Ejemplo # 5. Imágenes Asociadas a Cada Carpeta
var groupBy = imágenes.GroupBy(i => i.TipoImagen).Select(i => new {
key = tiposImágenes.Where(ti => ti.Clave.Equals(i.Key)).FirstOrDefault().Descripción,
imágenes = i.Select(img => new {
Clave = img.Clave,
Imagen = Path.Combine(img.Ruta, img.Nombre)
})
});
foreach (var carpeta in groupBy)
{
Console.WriteLine("Carpeta: {0}", carpeta.key);
foreach (var imagen in carpeta.imágenes)
{
Console.WriteLine("Clave: {0}, Imagen: {1}", imagen.Clave, imagen.Imagen);
}
}
Aquí les dejo un link para que puedan revisar más acerca de la sintáxis de Linq: MSDN Linq
Y en este otro pueden descargar el proyecto realizado en Visual Studio 2013: Descarga Código Fuente
- Linq
- LinqToEntities
- Tipos anónimos
Son métodos de extensión que nos permite realizar consultas, filtrado y muchas otras funcionalidades bastante parecido a como lo haríamos haciendo consultas sql en un manejador de bases de datos, incluso la sintáxis es bastante parecida.
LinqToEntities
Fue desarrollado para interactuar con Entity Framework, que sirve para interactuar de manera estandarizada con diferentes motores de bases de datos, en el que existe una clase de contexto y usándola podemos hacer consultas complejas al manejador de base de datos de manera simple usando código .NET.
Tipos Anónimos
A diferencia de los tipos dinámicos, son tipos estáticos fuertemente tipados que se validan en tiempo de compilación que nos permite crear objetos que no están basados en una clase, pero que nos ofrece una funcionalidad bastante útil a la hora de trabajar con linq.
Veamos 5 Ejemplos en los que intentamos ejemplificar los conceptos antes mencionados.
Definición de Entidades
internal class TiposImágenes
{
public int Clave { get; set; }
public string Descripción { get; set; }
}
internal class Imagen
{
public int Clave { get; set; }
public int TipoImagen { get; set; }
public string Ruta { get; set; }
public string Nombre { get; set; }
}
Llenado de Listas de Ejemplo
private static List<TiposImágenes> CargarTiposImágenes()
{
List<TiposImágenes> tiposImágenes = new List<TiposImágenes>();
tiposImágenes.Add(new TiposImágenes() {
Clave = 1,
Descripción = "Documento de Identidad"
});
tiposImágenes.Add(new TiposImágenes() {
Clave = 2,
Descripción = "Comprobante de Domicilio"
});
tiposImágenes.Add(new TiposImágenes() {
Clave = 3,
Descripción = "Comprobante de Ingresos"
});
return tiposImágenes;
}
private static List<Imagen> CargarImágenes()
{
List<Imagen> imágenes = new List<Imagen>();
imágenes.Add(new Imagen() {
Clave = 1,
TipoImagen = 1,
Ruta = "C:\\Imágenes",
Nombre = "Imagen1.jpg"
});
imágenes.Add(new Imagen() {
Clave = 2,
TipoImagen = 2,
Ruta = "C:\\Imágenes",
Nombre = "Imagen2.jpg"
});
imágenes.Add(new Imagen() {
Clave = 3,
TipoImagen = 2,
Ruta = "C:\\Imágenes",
Nombre = "Imagen3.jpg"
});
imágenes.Add(new Imagen() {
Clave = 4,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen4.jpg"
});
imágenes.Add(new Imagen() {
Clave = 5,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen5.jpg"
});
imágenes.Add(new Imagen() {
Clave = 6,
TipoImagen = 3,
Ruta = "C:\\Imágenes",
Nombre = "Imagen6.jpg"
});
return imágenes;
}
Ejemplo # 1. Imágenes en Carpeta 1
List<Imagen> filtrada = imágenes.Where(i => i.TipoImagen.Equals(1)).ToList();
foreach (Imagen imagen in filtrada)
{
Console.WriteLine("{0} {1}", imagen.Clave, imagen.Nombre);
}
Ejemplo # 2. Imágenes en Carpetas 1 y 2
var imágenesFiltradas = imágenes.Where(i => i.TipoImagen.Equals(1) || i.TipoImagen.Equals(2)).
Select(i => new{
TipoDocumento = tiposImágenes.
Where(ti => ti.Clave.Equals(i.TipoImagen)).FirstOrDefault().Descripción,
Imagen = Path.Combine(i.Ruta, i.Nombre)
});
foreach (var imagen in imágenesFiltradas)
{
Console.WriteLine("Tipo de Documento: {0}, Imagen: {1}",
imagen.TipoDocumento, imagen.Imagen);
}
Ejemplo # 3. Imágenes en Carpetas 2 y 3
int[] tiposImágenesFiltrar = new int[] { 2, 3 };
imágenesFiltradas = imágenes.Where(i => tiposImágenesFiltrar.Contains(i.TipoImagen)).
Select(i => new
{
TipoDocumento = tiposImágenes.
Where(ti => ti.Clave.Equals(i.TipoImagen)).FirstOrDefault().Descripción,
Imagen = Path.Combine(i.Ruta, i.Nombre)
});
foreach (var imagen in imágenesFiltradas)
{
Console.WriteLine("Tipo de Documento: {0}, Imagen: {1}",
imagen.TipoDocumento, imagen.Imagen);
}
Ejemplo # 4. Número de Imágenes Por Carpeta
var count = imágenes.GroupBy(i => i.TipoImagen).Select(i => new {
key = tiposImágenes.Where(ti => ti.Clave.Equals(i.Key)).FirstOrDefault().Descripción,
Count = i.Count()
});
foreach (var carpeta in count)
{
Console.WriteLine("Carpeta: {0}, Cantidad de Imágenes: {1}", carpeta.key, carpeta.Count);
}
Ejemplo # 5. Imágenes Asociadas a Cada Carpeta
var groupBy = imágenes.GroupBy(i => i.TipoImagen).Select(i => new {
key = tiposImágenes.Where(ti => ti.Clave.Equals(i.Key)).FirstOrDefault().Descripción,
imágenes = i.Select(img => new {
Clave = img.Clave,
Imagen = Path.Combine(img.Ruta, img.Nombre)
})
});
foreach (var carpeta in groupBy)
{
Console.WriteLine("Carpeta: {0}", carpeta.key);
foreach (var imagen in carpeta.imágenes)
{
Console.WriteLine("Clave: {0}, Imagen: {1}", imagen.Clave, imagen.Imagen);
}
}
Aquí les dejo un link para que puedan revisar más acerca de la sintáxis de Linq: MSDN Linq
Y en este otro pueden descargar el proyecto realizado en Visual Studio 2013: Descarga Código Fuente
Comentarios
Publicar un comentario