2011-12-28 21 views
5

Quiero ordenar por mis resultados con el recuento de coincidencias en mi línea de cadena.División de cadena con LINQ

Así que aquí es el código

.ThenByDescending(p => p.Title.ToLower() 
           .Split(' ') 
           .Count(w => words.Any(w.Contains))); 

Pero tráeme error y dice que LINQ no puede analizar Split en SQL.

LINQ to Entities no reconoce el 'System.String [] de Split (Char [])' método de método, y este método no puede ser traducido en una expresión tienda.

¿Cómo puedo implementar la división a través de LINQ?

Por ejemplo, para esta matriz debe ordenar de esta manera

words = { "a", "ab" } 

ab a ggaaag gh //3 matches 
ba ab ggt //2 matches 
dd //0 matches 

Respuesta

8

significa que LINQ no pudo encontrar entidades traducción de método de división que puede ser escrita como una consulta SQL. si desea realizar funciones de división que tiene que llevar el registro en la memoria llamando ToList(), AsEnumerable() etc.

var result = (from t in db.Table 
       select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....); 
+0

Pero eso causará la carga de todos los datos en la memoria y la realización de la transformación LINQ to Objects en su contra, ¿no? – abatishchev

+0

sí, eso es cierto. De manera óptima, puede aplicar condiciones en where cláususe antes de llamar a 'AsEnumerable'. no puede hacerlo sin traer objetos a la memoria –

+0

Supongo que se bloqueará con tablas grandes. Estoy de acuerdo con abatishchev. –

2

Tendrá que realizar la clasificación en LINQ a objetos porque LINQ a Entidades no puede traducir el código C# en SQL (o el lenguaje de cualquier DB que estés usando).

Puede hacerlo así.

var results = 
    objectContext 
    .Where(a => a == b) //Whatever 
    .AsEnumerable() 
    .ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains))); 

AsEnumerable() (junto con ToArray() o ToList()) gire el LINQ a Entidades de nuevo en LINQ a Objetos.

2

No se puede esperar que LINQ to Entities pueda convertir eso a SQL.

La mejor solución es cambiar el esquema de modo que cada palabra en el título de una publicación se almacene como una fila separada en una tabla separada (con las asociaciones apropiadas). La consulta puede usar operaciones explícitas de unión (grupo) o la propiedad de asociación FK.

Si no puede hacer esto y aún desea que la consulta se ejecute en la base de datos, tendrá que buscar una función definida por el usuario para trabajar con cadenas delimitadas. Lee this question para obtener más información. Sin embargo, esto será mucho trabajo.

La solución más fácil (si puede permitirse hacerlo) por supuesto es devolver todo al cliente simplemente use LINQ to Objects para esa parte de la consulta, como lo menciona @Muhammad Adeel Zahid.

Cuestiones relacionadas