El uso de Contains en LINQ – IN or NOT IN en SQL

Hay veces en las que desarrollando una aplicación Software, nos interesa obtener los elementos de una colección que contienen o que no contienen un conjunto de elementos.

Para ello, en LINQ hacemos uso de la extensión Contains.
De cara a SQL, esto sería similar a la instrucción que ejecutamos con la palabra IN.

SELECT * FROM Tabla WHERE campo NOT IN (”, ”, …)

La mejor forma de entender bien el funcionamiento de Contains, es verlo con un ejemplo.

El siguiente ejemplo es únicamente demostrativo y esta escrito en C#.

Comenzamos por crear una clase muy simple de productos frutales por decir algo:

public class Product
{
    
public string fruit { getset; }
}

Y finaliza con el código de ejemplo demostrativo de LINQ y Contains:

string[] fruits = new string[] { “Peras”“Platanos” };
List<Product> productsCollection = new List<Product>();
productsCollection.Add(
new Product() { fruit = “Naranjas” });
productsCollection.Add(
new Product() { fruit = “Peras” });
productsCollection.Add(
new Product() { fruit = “Limones” });
productsCollection.Add(
new Product() { fruit = “Platanos” });
var productElements = from element in productsCollection
                      
where !(fruits.Contains(element.fruit.ToString()))
                      
select element;
productsCollection = productElements.ToList();
foreach (var item in productsCollection)
{
    
MessageBox.Show(item.fruit);
}            

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 estan contenidas en la matriz.
Es decir, todas las frutas que no son ni Peras ni Platanos.
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):

string[] fruits = new string[] { “Peras”“Platanos” };
List<Product> productsCollection = new List<Product> { 
                                   
new Product { fruit=“Naranjas” }, 
                                   
new Product { fruit=“Peras” }, 
                                   
new Product { fruit=“Limones” }, 
                                   
new Product { fruit=“Platanos” }
                                   };
productsCollection = 
productsCollection.Where((n) => !(fruits.Contains(n.fruit.ToString()))).ToList();
foreach (var item in productsCollection)
{
    
MessageBox.Show(item.fruit);
}

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

8 comentarios sobre “El uso de Contains en LINQ – IN or NOT IN en SQL”

  1. En primer lugar, gracias por el articulo. Por lo que he leido creo que Microsoft va a dejar de dar soporte a LINQ 2 SQL,(Si me equivoco que alguien me de una colleja jeje), creo que deberias busxcar otra cosa Preguntoncojonero

  2. Hola @preguntoscojonero y @JTorrecilla,

    aqui te dejo un cheat sheet de LINQ to SQL para C#.
    Pasarlo a VB no es muy complicado.

    http://download.damieng.com/dotnet/LINQToSQLCheatSheet.pdf

    Es una referencia interesante. Es cierto que se podrian hacer videos sobre el tema… vere si puedo hacer algo. :-)

    Acerca de la pregunta de LINQ2SQL si se va a dejar o no, la respuesta parece ser que no.
    Si es cierto que con el empuje de Entity Framework 4.0, parece que LINQ2SQL no tendria sitio, pero muchos desarrolladores no quieren un submarino para ir al otro lado del rio, por lo que LINQ2SQL tiene aun su “mercado”.
    No se que va a pasar en el futuro, pero parece ser que LINQ2SQL se ha continuado en .NET Framework 4.0, menos que EF 4.0, pero tampoco son pocas las novedades que podria traer LINQ2SQL 4.0 como se indica aqui.

    http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

    Como indico el equipo de ADO.NET, ellos recomiendan EF 4.0, pero… no van a dejar tirados a los desarrolladores que usan LINQ2SQL como se puede leer aqui:

    http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx

    Espero haber respondido a las dudas. :-)

  3. La mezcla de EF y Linq to sql en un mismo proyecto es malo, no?

    Por ejemplo, dos subsistemas, uno con EntityFramework y otro con Linq to SQL.

    Qué pasaría con las transacciones por ejemplo, una transacción de EF y otra de Linq To SQL …es compatible ??

    Salu2grz, muy útil !!!

  4. hola jorge

    tres preguntas

    porque siempre se usa “var XXXXXXX ” para asignar el resultado del linq???

    si yo quisiera saber si en tu collection existen los valores del array como se realizaría???

    en caso no exista algun valor devuelto por el linq, como se valida?? o todo se le deja al foreach?

    Te explico el porque de la ultima pregunta. Yo tengo una coleccion que se cargan varios periodos de meses con sus importes. Lo que quiero saber si un periodo determinado existe en mi coleccion. En caso de no existir, yo debe añadirle ese valor a mi coleccion.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *