Linq: consulta el resultado de una consulta contra una lista de cadenas

Tengo una lista de cadenas

List<string> firstNames = new List<string>();                

Tengo un resultado de consulta

var contacts = (from p in datacontext.Contact)

¿Cómo puedo consultar el resultado original (contactos) con la lista de cadenas?

select * from contacts where contacts.firstname like firstNames

algo como

firstNames.Any(x=>x.contacts.Contains(x))

preguntado el 29 de septiembre de 11 a las 13:09

2 Respuestas

Probablemente debería insertar los nombres en la consulta de la base de datos, así:

var contacts = dataContext.Contacts.Where(c => firstNames.Contains(c.FirstName));

Ahora usó "me gusta" en su consulta de muestra, así que tal vez desee:

var contacts = dataContext.Contacts
                     .Where(c => firstNames.Any(f => c.FirstName.Contains(f)));

Si pudiera proporcionar algunos ejemplos concretos, sería útil.

EDITAR: Si eres realmente retirando todos los contactos de la base de datos ya en (digamos) un List<Contact> contacts, entonces podrías usar:

var matchingContacts = from contact in contacts
                       join name in firstNames
                       on contact.FirstName equals name
                       select contact;

Respondido el 29 de Septiembre de 11 a las 18:09

Me he encontrado con problemas al hacer cosas como esta debido al contexto mixto (base de datos versus memoria). ¿No es necesario traer ambas secuencias en un contexto común? - Joel Etherton

@JoelEtherton: Depende de lo que hagas, pero pasar un List<string> en la consulta de la base de datos es bastante común. Lo principal es hacerlo de la manera correcta para que no termine llevando toda la base de datos al cliente. - Jon Skeet

Tenga cuidado con 'Contiene'. Podría traducirse a "SELECT * FROM t WHERE x IN ('a', 'b', 'c', ...)". Pero la mayoría de las implementaciones de SQL limitan la longitud de la lista. Podría ser posible tener algunas docenas o cientos de artículos, ¡pero ciertamente no miles! - Olivier Jacot-Descombes

@ OlivierJacot-Descombes: Efectivamente. Si solo hay unos pocos contactos en la base de datos pero muchos nombres en la lista, entonces, obviamente, es mejor extraer todos los contactos. Si hay muchos nombres en la lista y muchos contactos en la base de datos, la vida se vuelve más difícil ... - Jon Skeet

Me gustaría consultar la consulta original para que solo acceda a la base de datos una vez. - user971210

Primero, visite este enlace, descargue la clase y agréguela a su carpeta App_Code: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Luego, asegúrese de agregar "using System.Linq.Dynamic;"

Luego construya su consulta de esta manera:

    DatabaseDataContext db = new DatabaseDataContext();
    List<string> firstNames = new List<string>();

    //--- loop through names and build a where query
    string WhereClause = string.Empty;
    for (int i = 0; i < firstNames.Count(); i++)
    {
        string s = firstNames[i].ToLower();

        if (i != Communities.Length - 1)
            WhereClause += "FirstName.ToLower().Contains(\"" + s + "\") OR "; //--- first name is the field name in the db
        else
            WhereClause += "FirstName.ToLower().Contains(\"" + s + "\")";
    }

    //--- execute query and pass the dynamic where clause
    IQueryable contacts = db.Contacts
                          .Where(WhereClause)
                          .OrderBy("FirstName");

¡Buena suerte!

Respondido el 30 de Septiembre de 11 a las 03:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.