2009-08-04 15 views
48

come faccio a trasmettere e int in una stringa? Nessuno dei seguenti fare lavori:Linq int alla stringa

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 

EDIT

L'errore che ottengo è:

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

+0

I primi due dovrebbero funzionare ... puoi approfondire cosa significa "nessuno dei seguenti ... lavori"? –

+0

Non stai ottenendo alcun risultato? Hai confermato che la colonna "Codice" contiene un valore che inizia con un "1"? – Keith

+1

www.linqpad.net è ottimo per l'apprendimento di Linq (e praticamente di qualsiasi altra cosa in .NET). È gratuito e altamente raccomandato. Inoltre, la sua Intellisense da $ 19 è ottima. –

risposta

-1

Ecco un modo per farlo.

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

questo non lo aiuta - sta usando linq alle entità – ShuggyCoUk

2

ho avuto un problema simile

 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 lanciava "non può convertire l'errore di tipo non primativo" come un int? Dopo aver seguito il collegamento di shuggy, ho risolto aggiungendo .AsEnumerable per forzare int? -> conversione stringa 'lato client', ad esempio LINQ to Objects. vale a dire

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

     }); 
+0

Grazie, hai definitivamente salvato la mia giornata. L'aggiunta di 'AsEnumerable' era la chiave qui. –

+0

AsEnumerable() farà caricare l'intera tabella del database in memoria? – Dwayne

55

Con v4 EF è possibile utilizzare SqlFunctions.StringConvert. Quindi, il codice sarebbe finita simile a questo:

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

EDIT

Come Rick cita nel suo commento, la ragione per la fusione int ad una doppia (decimale probabilmente funziona ugualmente) è che la funzione fa non ha un sovraccarico per int.

+10

Questo ha funzionato per me! L'unica cosa divertente di questo è che apparentemente non c'è sovraccarico di questa funzione per "int". Ecco perché Brian sta inscatolando questo come un doppio prima di chiamare la funzione sopra. A mio parere, questo deve essere contrassegnato come la risposta a questa domanda. –

+0

Anche questo ha funzionato per me. Sono d'accordo con Rick Arthur che questa dovrebbe essere la risposta. – Alban

+2

questa risposta è ora più utile della mia, se l'op vuole cambiare la risposta accettata che andrebbe bene, altrimenti aggiungerò una nota per indicare che, dalla v4 dovresti usare la tua risposta. – ShuggyCoUk

1

cast IQueryable a IEnumerable poiché IQueryable eredita IEnumerable. vedere http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx - in particolare: "L'enumerazione causa l'esecuzione dell'albero delle espressioni associato a un oggetto IQueryable." Penso che la cosa importante sia "La definizione di" esecuzione di un albero di espressioni "è specifica per un provider di query".

IQueryable è molto potente ma utilizzato in modo errato in questo contesto.

+0

Questo ha funzionato anche per me, grazie mille. – jmaragon

+0

Questo è stato suggerito in [questa domanda simile] (http://stackoverflow.com/questions/1765423/problem-getting-guid-string-value-in-linq-to-entity-query). La cosa bella di questo approccio è che funziona per dati non numerici, come Guids. –

1

ho provato questa soluzione e ha funzionato per me:

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

Spero che questo aiuti

2

Quando si utilizza LINQ to Objects è possibile utilizzare l'helper 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 
}; 

ho scoperto che SqlFunctions.StringConvert ((doppia) c.Età) non ha funzionato per me o il campo è di tipo Nullable

Ci sono voluti un sacco di ricerche negli ultimi giorni di tentativi ed errori per trovarlo.

Spero che questo aiuti alcuni programmatori là fuori.

+1

Sto provando a selezionare SelectListItems e a trasmettere un ID int nella stringa "Value", come nel tuo esempio. Ma con questo codice ottengo che 'LINQ to Entities non riconosce il metodo 'System.String Concat (System.Object)' e questo metodo non può essere tradotto in un'espressione di archivio. –