2010-09-15 10 views
5

Esta función se utiliza para devolver una lista de contactos para la entrada de búsqueda de un usuario. El número de términos de búsqueda siempre es al menos uno, pero podría ser muchos.¿Cuál es la forma correcta de agregar dinámicamente un número indeterminado de cláusulas a una consulta Linq 2 Sql?

public IList<Contact> GetContacts(string[] searchTerms) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         orderby _contacts.LastName ascending, _contacts.FirstName ascending 
         select _contacts; 

     foreach (string term in searchTerms) 
     { 
      contacts = (IOrderedQueryable<Contact>)contacts.Where(x => SqlMethods.Like(x.FirstName, "%" + term + "%") 
                    || SqlMethods.Like(x.MiddleName, "%" + term + "%") 
                    || SqlMethods.Like(x.LastName, "%" + term + "%") 
                    || SqlMethods.Like(x.PreferredName, "%" + term + "%")); 
     } 

     return contacts.ToList<Contact>(); 
    } 
} 

El problema está en el circuito. Solo se utiliza el último término de búsqueda, aunque el sql generado parece correcto (como en la cantidad correcta de cláusulas generadas para el número de términos).

Ejemplo: si paso dos términos ('andr', 'sm'), el sql generado muestra dos bloques de cláusulas como se esperaba, pero solo usa 'sm' como parámetro en ambos bloques.

¿Qué estoy haciendo mal? ¿Debería incluso estar usando SqlMethods?

+1

Usted dice que el SQL generado parece correcto, ¿puede publicarlo? ¿Has intentado ejecutar el SQL generado manualmente? –

+0

sí funciona si ejecuto manualmente, simplemente está usando el último 'término' en la matriz como el param para todos los parámetros. Extraño. – IckleMonkey

Respuesta

5

Quizás el problema está en capturar el término variable de bucle. Pruebe esto:

foreach (string term in searchTerms) 
{ 
    string t = term; 
    contacts = ... // use t instead of term 
} 
+0

Tú mi amigo eres un genio. ¡¡¡Trabajos!!! – IckleMonkey

+0

¿Sabes por qué esto sucedería? – IckleMonkey

+0

porque está cerrando una variable de bucle, por lo que cuando llega a ejecutar el término de consulta siempre es el último valor en la matriz pasada. vea esta pregunta: http://stackoverflow.com/questions/227820/why-is-it-bad-to-use-a-iteration-variable-in-a-lambda-expression –

Cuestiones relacionadas