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?
Usted dice que el SQL generado parece correcto, ¿puede publicarlo? ¿Has intentado ejecutar el SQL generado manualmente? –
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