2010-04-21 18 views
11

que estoy usando el siguiente código:Concatenate y la cadena en LINQ a Entidades

from c in Country 
where c.IsActive.Equals(true) 
orderby c.CountryName 
select new 
{ 
    countryIDCode = c.CountryID + "|" + c.TwoDigitCode, 
    countryName = c.CountryName 
} 

pero me sale este error mientras se ejecuta es:

Unable to cast the type 'System.Int32' to type 'System.Object'. LINQ to Entities only supports casting Entity Data Model primitive types.

CountryId es int tipo y TwoDigitCode es string Tipo .

¿Cómo puedo concatenar correctamente?

Respuesta

6

Si este error le impide progresar y es un pequeño conjunto de datos que podría podría hidratar la recuperación de la base de datos mediante la enumeración de la consulta (llamada Listar). A partir de ese momento, sus operaciones serán contra objetos en memoria y es posible que no encuentre el error que está recibiendo.

var countries = (from c in Country 
where c.IsActive.Equals(true) 
orderby c.CountryName 
select c).ToList(); 


var countryCodes = (from c in countries 
where c.IsActive.Equals(true) 
    orderby c.CountryName 
    select new 
    { 
     countryIDCode = c.CountryID + "|" + c.TwoDigitCode, 
     countryName = c.CountryName 
    }); 
+6

Creo que esta respuesta es obsoleta y en general una mala práctica. Es un arreglo rápido y sucio que funciona por ahora pero te morderá más tarde (por ejemplo, cuando tu pequeño conjunto de datos actualmente de repente crece, o el cliente decide que quiere exactamente lo mismo en otro conjunto de datos mucho más grande). Vea la respuesta de flyfisher1952 que usa las funciones db directamente, por lo que es una forma mucho mejor de resolver el problema que esta respuesta. – Mtz

-3

Uso c.CountryId.ToString() para obtener una representación de cadena de su CountryId y concatenar que a su campo TwoDigitCode:

from c in Country 
where c.IsActive.Equals(true) 
orderby c.CountryName 
select new 
{ 
    countryIDCode = c.CountryID.ToString() + "|" + c.TwoDigitCode, 
    countryName = c.CountryName 
} 

espero que su error es en realidad un error de compilación (no se puede pensar en ninguna manera el compilador permitirá esta consulta. No estoy seguro de cómo sabe sobre la parte Linq to Entities).

+2

No, esto no puede ser utilizado. El siguiente error en este caso: LINQ to Entities no reconoce el método 'System.String ToString()', y este método no se puede traducir a una expresión de tienda. – Waheed

+0

es una excepción o un error del compilador? –

+0

Da error de tiempo de ejecución. Intenté como dijiste :( – Waheed

-3

Si necesita concat juntos como una cadena que podría utilizar String.Format método:

countryIDCode = String.Format("{0}|{1}", c.CountryID, c.TwoDigitCode) 
+1

No, da error de tiempo de ejecución: LINQ to Entities no reconoce el método 'System.String Format (System.String, System.Object, System .Object) 'método, y este método no se puede traducir a una expresión de tienda. – Waheed

+1

.ToString() y .Format() no se pueden ejecutar en el cliente sql por lo que esto dará un error de tiempo de ejecución. – gingerbreadboy

+3

Bueno, la pregunta era 'Concatenar int y string en LINQ' no en Linq To SQL, etc. El OP debería haber sido más claro. LINQ! = SQL –

5

Este tema contiene una lista de métodos de CLR que se pueden convertir a comandar las funciones canónicas de árboles y ejecutados en el servidor:

MSDN

para los métodos de CLR no aparecen en esta lista, que tendría que tirar de los resultados hasta el cliente utilizando .AsEnumerable() y ejecutar una consulta LINQ a Objetos.

2

Esto es una limitación de la versión anterior de Entity Framework. Creo que con v4 está resuelto. Para su versión de la solución consiste en convertir el resultado a un enumerable:

from a in 
(from c in Country 
where c.IsActive.Equals(true) 
orderby c.CountryName).AsEnumerable() 
select new 
{ 
    countryIDCode = a.CountryID + "|" + a.TwoDigitCode, 
    countryName = a.CountryName 
} 
+0

Estoy intentando su método pero estoy obteniendo un error de tiempo de compilación: Un cuerpo de consulta debe terminar con una cláusula de selección o una cláusula de grupo. – Waheed

+0

Disculpa, hubo un error de sintaxis ... Lo edité, pruébalo ahora. –

+0

La consulta que muestre funcionará más o menos correctamente en EF 1 y 4. –

2

No hay mapping to a Canonical Function para la int a string fundición.

Así que devolver el Int y la cadena en 2 columnas diferentes y luego concatenar en .NET después de usar el método de AsEnumerable:

var cListTemp = from c in Country 
    where c.IsActive.Equals(true) 
    orderby c.CountryName 
    select new 
    { 
     countryID = c.CountryID, 
     twoDigitCode = c.TwoDigitCode, 
     countryName = c.CountryName 
    }; 

var cList = cListTemp.AsEnumerable().Select(c => new { 
    countryIDCode = c.countryID + "|" + c.twoDigitCode, 
    countryName = c.countryName 
}); 
22

Uso System.Data.Objects.SqlClient .SqlFunctions.StringConvert

from c in Country 
where c.IsActive.Equals(true) 
orderby c.CountryName 
select new 
{ 
    countryIDCode = SqlFunctions.StringConvert((double)c.CountryID) 
        + "|" + c.TwoDigitCode, 
    countryName = c.CountryName 
} 
+0

¿Por qué no funcionan los métodos .ToString() o Convert.ToString()? – shamim

+0

No estoy muy seguro. Los tipos de bases de datos siempre han actuado un poco extraño desde mi punto de vista y las utilidades SqlFunctions son lo que he usado para resolver problemas como el publicado. Favorezco este enfoque sobre las soluciones menos obvias, como la conversión a la lista de distribución, ya que ** explícitamente ** muestra lo que le estás haciendo a cualquiera que intente mantener tu código. – flyfisher1952

+0

Creo que esta debería ser la respuesta aceptada, ya que resuelve el problema sin introducir penalizaciones de rendimiento como la respuesta de Nicholas Murray (a pesar de que dice '... y es un pequeño conjunto de datos'). – Mtz

2

que fue capaz de concatenar cadenas con el siguiente código:

l.StateName + " " + SqlFunctions.StringConvert((double?)l.Zip).Trim() 

Parece que fue SqlFunctions.StringConvert((double?)l.Zip) sería lo suficientemente bueno, pero la cadena resultante tiene un montón de relleno en la izquierda, que hace que las comparaciones de cadenas no coincidan. Resulta, Trim() trabaja para afeitar el extra. Creo que SqlFunctions.StringConvert((double?)l.Zip).Trim() se convierte efectivamente en el SQL: LTrim(RTrim(STR(Zip))).