El uso de Contains en LINQ - IN or NOT IN en SQL - Jorge Serrano - MVP Visual Developer - Visual Basic

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.

Published 5/11/2009 8:00 por Jorge Serrano
Comparte este post:

Comentarios

Thursday, November 5, 2009 1:01 PM por preguntoncojonero

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

alguna buena referencia para linq to sql, que sea eminentemente práctica...no hay un msdn video - linq to sql ???

salu2&grz

Thursday, November 5, 2009 1:18 PM por JTorrecilla

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

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

Thursday, November 5, 2009 2:46 PM por Jorge Serrano

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

Hola @preguntoscojonero y @JTorrecilla,

aqui te dejo un cheat sheet de LINQ to SQL para C#.

Pasarlo a VB no es muy complicado.

download.damieng.com/.../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.

damieng.com/.../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:

blogs.msdn.com/.../update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx

Espero haber respondido a las dudas. :-)

Thursday, November 5, 2009 3:04 PM por preguntoncojonero

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

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 !!!

Thursday, November 5, 2009 4:05 PM por JTorrecilla

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

Gracias Jorge, no habia visto esta entrada del BLOG y de ahi mi error.

Un saludo

Friday, November 13, 2009 10:57 PM por jaime

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

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.

Tuesday, April 13, 2010 6:43 PM por CRS

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

yyyyyyy cuando no es un texto sino son numeros... los que se quieren buscar con el in...

Wednesday, May 5, 2010 6:08 PM por Jorge Gomez

# re: El uso de Contains en LINQ - IN or NOT IN en SQL

Pasaba por aqui, buscando el In en linQ, pos un saludo torpedor.