2010-01-06 19 views
5

Tengo un caso en mi aplicación donde el usuario puede buscar una lista de términos. La búsqueda debe realizar tres pasos en el siguiente orden:Linq a Sql cualquier consulta de búsqueda de palabra clave

  • Uno para una coincidencia exacta de lo que ingresaron. Hecho, fácil.
  • Uno donde coinciden todas las palabras (individualmente). Hecho, también es fácil.
  • Uno donde cualquier de las palabras coinciden ... ¿cómo?

En esencia, ¿cómo, en LINQ to SQL, digo que para hacer esto:

select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like... 

Y así sucesivamente?

+0

Debe saber que este tipo de cosas se maneja mejor con Full-Text Search. Se ejecutará la versión 'LIKE '% xyz%'', pero el rendimiento será desagradable. – Aaronaught

Respuesta

7

Esto podría ser difícil ... Creo que tendrías que escribir tu propio operador.

(Actualización:. Sí, lo he probado, funciona)

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> LikeAny<TEntity>(
     this IQueryable<TEntity> query, 
     Expression<Func<TEntity, string>> selector, 
     IEnumerable<string> values) 
    { 
     if (selector == null) 
     { 
      throw new ArgumentNullException("selector"); 
     } 
     if (values == null) 
     { 
      throw new ArgumentNullException("values"); 
     } 
     if (!values.Any()) 
     { 
      return query; 
     } 
     var p = selector.Parameters.Single(); 
     var conditions = values.Select(v => 
      (Expression)Expression.Call(typeof(SqlMethods), "Like", null, 
       selector.Body, Expression.Constant("%" + v + "%"))); 
     var body = conditions.Aggregate((acc, c) => Expression.Or(acc, c)); 
     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

Posteriormente, se podría llamar a esto con:

string[] terms = new string[] { "blah", "woo", "fghwgads" }; 
var results = stuff.LikeAny(s => s.Title, terms); 

P. S. Tendrá que agregar los espacios de nombres System.Linq.Expressions y System.Data.Linq.SqlClient a sus espacios de nombres para la clase QueryExtensions.

+0

¡Eso funcionó! ¡Gracias! – Dusda

+0

Utilicé el código en Linq para Entidades, y aparece este error: LINQ to Entities no reconoce el método 'Boolean Like (System.String, System.String)', y este método no se puede traducir a una expresión de tienda. –

Cuestiones relacionadas