Uso de Contains en LINQ

.NET, Delphi Prism Dejar un comentario

En muchas ocasiones cuando estamos desarrollando una aplicación necesitamos obtener los elementos de una colección que contengan o no un conjunto de elementos.

Para esta tarea, en LINQ hacemos uso de la extensión Contains.

Para poner un ejemplo similar y así pode entender de que hablo observe la siguiente instrucción SQL:

Select * from Tabla Where campo Not In (‘Valor1’,’Valor2’….)

En esta instrucción SQL estamos obteniendo los valores de la tabla que no estén dentro del conjunto de valores que estamos especificando.

Vamos a ver como lograr algo similar utilizando LINQ.

El siguiente ejemplo es únicamente demostrativo y está escrito en Delphi Prism.

Comenzamos por crear una clase muy simple de productos frutales por ejemplo:

type
TProducto = public class
public
   property fruta : String;
end;

Y el código de ejemplo demostrativo de LINQ y Contains sería:

var frutas : array of String := ['Peras','Platanos'];
var ColeccionProductos : List<TProducto> := new List<TProducto>();
ColeccionProductos.Add(new TProducto(fruta := 'Naranjas'));
ColeccionProductos.Add(new TProducto(fruta := 'Peras'));
ColeccionProductos.Add(new TProducto(fruta := 'Limones'));
ColeccionProductos.Add(new TProducto(fruta := 'Platanos'));
var ElementosProductos := from elemento in ColeccionProductos
                                     where not (frutas.Contains(elemento.fruta.ToString()))
                                     select elemento;
ColeccionProductos :=  ElementosProductos.ToList();
for each item in ColeccionProductos do
   MessageBox.Show(item.fruta);

Como podemos ver en este ejemplo, creamos una colección de frutas y una matriz con el nombre de dos frutas.
Lo que queremos obtener son todas las frutas que no están contenidas en la matriz.
Es decir, todas las frutas que no son ni Peras ni Plátanos.
En SQL estándar serían las frutas NOT IN (‘Peras’, ‘Platanos’).
Adicionalmente, también podemos hacer uso de las funciones Lambda, por lo que todo el funcionamiento anterior, se resumiría de la siguiente manera (equivalente de la anterior):

var frutas : array of String := ['Peras','Platanos'];
var ColeccionProductos : List<TProducto> := new List<TProducto>();
ColeccionProductos.Add(new TProducto(fruta := 'Naranjas'));
ColeccionProductos.Add(new TProducto(fruta := 'Peras'));
ColeccionProductos.Add(new TProducto(fruta := 'Limones'));
ColeccionProductos.Add(new TProducto(fruta := 'Platanos'));
ColeccionProductos := ColeccionProductos.Where((n) -> not (frutas.Contains(n.fruta.ToString()))).ToList();
for each item in ColeccionProductos do
  MessageBox.Show(item.fruta);

Espero que quede clara (para quien lo necesite) la funcionalidad, beneficios y usos de Contains en LINQ.

Deja un comentario

Entradas RSS Comentarios RSS Acceder