una separar recortar por parte metodo extraer ejemplos comas caracter cadena .net linq linq-to-entities string-split

.net - separar - LINQ to Entities: ¿Por qué no puedo usar el método Split como condición?



split separar por comas (4)

Creo que es la forma en que llamas a Split. Debería tomar una matriz. Tal vez haya otra división en Linq que encuentre y le dé un error inusual:

Esto funciona para Linq to Objects:

var dataStore = new List<string> { "foo,bar,zoo", "yelp,foo", "fred", "" }; var results = from a in dataStore where a.Split(new[] {'',''}).Contains("foo") select a; foreach (var result in results) { Console.WriteLine("Match: {0}", result); }

Resultados lo siguiente:

Match: foo,bar,zoo Match: yelp,foo

En realidad, al pensarlo, ¿necesitas la división? a.Contains("foo") puede ser suficiente para ti (a menos que no desees presionar foobar ).

Tengo la siguiente consulta LINQ:

var aKeyword = "ACT"; var results = from a in db.Activities where a.Keywords.Split('','').Contains(aKeyword) == true select a;

Palabras clave es un campo delimitado por comas.

Cada vez que ejecuto esta consulta, aparece el siguiente error:

"LINQ to Entities no reconoce el método ''Boolean Contains [String] (System.Collections.Generic.IEnumerable`1 [System.String], System.String)'' método, y este método no se puede traducir a una expresión de tienda."

¿Cuál es la alternativa para lo que estoy tratando de hacer?


En respuesta a sus consideraciones de rendimiento en un gran conjunto de datos:

Va a hacer una coincidencia de cadena comodín no indexada en el cliente, por lo que sí, habrá una pérdida de rendimiento.

¿Hay alguna razón por la que tenga varias palabras clave en un campo de tabla? Usted podría normalizar eso, tener una tabla de ActivityKeywords donde para cada actividad tenga una cantidad de registros de palabras clave.

Actividades (activity_id, ... / * eliminar campo de palabras clave * /) ---> ActivityKeywords (activity_id, keyword_id) ---> Keywords (keyword_id, value)

Echa un vistazo a la forma normal no primera: http://en.wikipedia.org/wiki/Database_normalization

EDITAR: Además, incluso si se quedara con una columna, hay una manera de hacer todo lo que se encuentra en el servidor (si tiene una sintaxis estricta: ''palabra clave 1, palabra clave 2, ..., palabra clave N''):

var aKeyword = "ACT"; var results = (from a in db.Activities where a.Keywords.Contains("," + aKeyword) || a.Keywords.Contains(aKeyword + ",") select a;



Su problema es que LINQ-to-Entites tiene que traducir todo lo que le da a SQL para enviarlo a la base de datos.

Si eso es realmente lo que necesita hacer, tendrá que forzar a LINQ-to-Entities a que retire todos los datos y LINQ-to-Objects para evaluar la condición.

Ex:

var aKeyword = "ACT"; var results = from a in db.Activities.ToList() where a.Keywords.Split('','').Contains(aKeyword) == true select a;

Tenga en cuenta, sin embargo, que esto retirará todos los objetos de la tabla Actividades. Una alternativa puede ser dejar que el DB haga un poco de filtro inicial, y luego filtrar el resto del camino:

var aKeyword = "ACT"; var results = (from a in db.Activities where a.Keywords.Contains(aKeyword) select a).ToList().Where(a => a.KeyWords.Split('','').Contains(aKeyword));

Eso permitirá que LINQ-to-Entities haga el filtro que entiende (string.Contains se convierte en una consulta similar) que filtrará algunos de los datos, luego aplicará el filtro real que desee a través de LINQ-to-Objects una vez que haya recuperado los objetos . La llamada ToList () fuerza a LINQ-to-Entities a ejecutar la consulta y crear los objetos, lo que permite que LINQ-to-Objects sea el motor que realiza la segunda parte de la consulta.