2009-08-04 20 views
48

¿cómo echo y int en una cadena? Ninguno de los siguientes no funciona:Linq int en la cadena

from s in ctx.Services 
    where s.Code.ToString().StartsWith("1") 
    select s 

from s in ctx.Services 
    where Convert.ToString(s.Code).StartsWith("1") 
    select s 

from s in ctx.Services 
    where ((string)s.Code).ToString().StartsWith("1") 
    select s 

EDITAR

El error que consigo es:

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression

+0

Las dos primeras deberían funcionar ... ¿pueden explicar en detalle qué significa "Ninguna de las siguientes ... funciones"? –

+0

¿Simplemente no está obteniendo ningún resultado? ¿Has confirmado que la columna "Código" contiene un valor que comienza con un "1"? – Keith

+1

www.linqpad.net es ideal para aprender Linq (y casi cualquier otra cosa en .NET). Es gratis y altamente recomendado. Además, su Intellisense de $ 19 es genial. –

Respuesta

-1

Aquí es una manera de hacerlo.

int[] x = new int[] {11,3,15,7,19}; 

var j = from s in x where s.ToString().StartsWith("1") select s.ToString(); 

Console.WriteLine(j); 
+7

esto no lo ayuda - está usando linq para las entidades – ShuggyCoUk

2

tuve un problema similar

 IQueryable<Street> query = db.Streets.AsQueryable(); 
     query = query.Where(street => street.Name.ToLower().StartsWith(keyword)) 
         .Take(10) 
         .OrderBy(street => street.Name); 

     var list = query.Select(street => new 
     { 
      street.StreetId, 
      Name = street.Name + " " + street.Suburb.Name + " " + street.Suburb.State.Name + " " + street.Suburb.Postcode 

     }); 

street.Suburb.Postcode estaba lanzando 'no se puede convertir el error de tipo no primitivo' ya que es un int? Después de seguir el enlace de shuggy lo arreglé agregando .AsEnumerable para forzar int? -> conversión de cadena 'lado del cliente', es decir, LINQ to Objects. es decir,

var list = query.AsEnumerable().Select(street => new 
     { 
      street.StreetId, 
      Name = street.Name + " " + street.Suburb.Name + " " + street.Suburb.State.Name + " " + street.Suburb.Postcode 

     }); 
+0

Gracias, definitivamente salvaste mi día. Agregar 'AsEnumerable' fue la clave aquí. –

+0

¿AsEnumerable() hará que toda la tabla de la base de datos se cargue en la memoria? – Dwayne

55

Con v4 EF puede utilizar SqlFunctions.StringConvert. Así que su código terminaría con este aspecto:

from s in ctx.Services 
where SqlFunctions.StringConvert((double)s.Code).StartsWith("1") 
select s 

EDITAR

Como Rick menciona en su comentario, la razón para la fundición de la int a un doble (decimal probablemente funciona también) es que la función hace no tener una sobrecarga para int.

+10

¡Esto funcionó para mí! Lo único gracioso de esto es que aparentemente no hay sobrecarga de esta función para 'int'. Es por eso que Brian boxeo esto como un doble antes de llamar a la función anterior. En mi opinión, esto debe marcarse como la respuesta a esta pregunta. –

+0

Esto, también, funcionó para mí. Estoy de acuerdo con Rick Arthur en que esta debería ser la respuesta. – Alban

+2

esta respuesta ahora es más útil que la mía, si el operador desea cambiar la respuesta aceptada, estaría bien, de lo contrario agregaré una nota para indicar que, desde v4, debe usar su respuesta. – ShuggyCoUk

1

cast IQueryable to IEnumerable porque IQueryable hereda IEnumerable. ver http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx - específicamente: 'La enumeración hace que se ejecute el árbol de expresiones asociado con un objeto IQueryable.' Creo que lo importante es 'La definición de' ejecutar un árbol de expresiones 'es específica de un proveedor de consultas'.

IQueryable es muy potente pero se usa incorrectamente en este contexto.

+0

Esto también me ha funcionado, muchas gracias. – jmaragon

+0

Esto fue sugerido en [esta pregunta similar] (http://stackoverflow.com/questions/1765423/problem-getting-guid-string-value-in-linq-to-entity-query). Lo bueno de este enfoque es que funciona para datos no numéricos, como Guids. –

1

he intentado esta solución y funcionó para mí:

from s in ctx.Services 
where (s.Code + "").StartsWith("1") 
select s 

Esperanza esto ayuda

2

Al utilizar LINQ a objetos que puede utilizar el ayudante ToString().

-1
from s in ctx.Services.ToList() 
    where s.Code.ToString().StartsWith("1") 
    select s 
-1
var items = from c in contacts 
select new ListItem 
{ 
    Value = String.Concat(c.ContactId), //This Works in Linq to Entities! 
    Text = c.Name 
}; 

encontré que SqlFunctions.StringConvert (doble c().Edad) no funcionó para mí tampoco el campo es de tipo Nullable

Me llevó mucho buscando en los últimos días de prueba y error para encontrar esto.

Espero que esto ayude a algunos codificadores por ahí.

+1

Estoy tratando de seleccionar SelectListItems y convertir una ID int en la propiedad "Value" de la cadena, igual que en el ejemplo. Pero con este código obtengo 'LINQ to Entities no reconoce el método 'System.String Concat (System.Object)', y este método no se puede traducir a una expresión de tienda. –