2010-03-25 18 views
13

Hi questo sembra come dovrebbe funzionare,LINQ Guid toString()

from something in collectionofsomestuff  
select new SelectListItem(){Text = something.Name, Value = something.SomeGuid.ToString(), Selected = false}; 

Quando provo a fare questo non funziona mi danno errore

LINQ to Entities non riconosce il metodo 'System.String ToString()' metodo, e questo metodo non può essere tradotto in un'espressione di archivio.

C'è una soluzione?

+0

Da quale ambito vengono "Nome" e "SomeGuid"? Non è chiaro. – spender

+0

scusa .. è meglio? – Sevki

risposta

5

Non tutti i metodi CLR possono essere utilizzati con le entità Linq-to-Entities. ToString() sembra essere uno di questi.

Dai uno sguardo allo CLR Method to Canonical Function Mapping.

Forse provare a impostare il GUID su una variabile di stringa in modo esplicito, al di fuori di Linq.

string myGuid = SomeGuid.ToString(); 

from something in collectionofsomestuff  
select new SelectListItem(){Text = Name, Value = myGuid, Selected = false}; 
4

non parlo Linq espressioni di query troppo bene, ma il seguente dovrebbe fare il trucco:

collectionofsomestuff //here it's LinqToEntities 
    .Select(something=>new{something.Name,something.SomeGuid}) 
    .ToArray() //From here on it's LinqToObjects 
    .Select(s=>new SelectListItem() 
     { 
      Text = s.Name, 
      Value = s.SomeGuid.ToString(), 
      Selected = false 
     }) 
+0

mi dispiace lo stesso errore ... – Sevki

+0

Esattamente quello che stavo cercando. Grazie tante! – defines

1

ho finito per fare un foreach in questo modo

  List<SelectListItem> list = new List<SelectListItem>(); 
     foreach (SomeThing something in collectionofsomestuff) 
     { 
      list.Add(new SelectListItem(){Text = something.Name,Selected = false,Value = something.SomeGuid.ToString()}); 
     } 

questo è l'unico modo per farlo funzionare. Non era quello che speravo di fare ..

1

Creare un costruttore per SelectLi STATO che accetta il tuo valore come guida e ToString lì. Ora chiamare la query in questo modo:

from something in collectionofsomestuff select new SelectListItem(something.Name, something.SomeGuid, false); 
5

è possibile ottenere i record nel db, e poi li trasformano in un elenco o di una matrice uso ToList() o ToArray() Quindi utilizzare l'oggetto.. Per esempio (è LINQ to Entities):

var list = collectionofsomestuff.select(c => c).ToList(); 
from something in list 
select new SelectListItem(){Text = something.Name, Value = something.SomeGuid.ToString(), Selected = false}; 
+0

Penso che questa sia la migliore risposta. Puoi anche usare '. AsQueryable' prima di chiamare' .Select (new SelectListItem (... ' – user1477388

1

Ho avuto lo stesso problema, e ho finito per cambiare la definizione del mio oggetto per aggirare il problema. Si tratta di un hack completo, ma mi permette di popolare i dati direttamente dalla query:

[DataContract] 
public class DeviceInfo 
{ 
    public Guid DeviceGuid 
    { 
     set 
     { 
      DeviceID = value.ToString(); 
     } 
    } 
    [DataMember] 
    public string DeviceID { get; set; } 
} 

E la query funziona come previsto perché ha qualcosa di diverso di fare la conversione per esso:

devices.AddRange(from d in ae.UserDevices 
        select new DeviceInfo 
        { 
         DeviceGuid = d.DeviceID 
        } 

E ' rende l'oggetto un po 'più disordinato, ma rende molto più facile gestire la Guida nella query.