2010-03-25 12 views
13

Hallo dies scheint, wie es funktionieren sollte,LINQ Guid toString()

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

Wenn ich versuche, dies zu tun, es mir

LINQ to Entities nicht funktioniert geben Fehler nicht das erkennen Methode 'System.String ToString()' Methode, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

Gibt es eine Problemumgehung?

+0

Aus welchem ​​Bereich kommen "Name" und "SomeGuid"? Es ist nicht klar. – spender

+0

Entschuldigung .. ist das besser? – Sevki

Antwort

5

Nicht alle CLR-Methoden können mit Linq-to-Entities verwendet werden. ToString() scheint einer von ihnen zu sein.

Werfen Sie einen Blick auf CLR Method to Canonical Function Mapping.

Vielleicht versuchen Sie, die GUID explizit außerhalb von Linq auf eine String-Variable zu setzen.

string myGuid = SomeGuid.ToString(); 

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

Ich spreche nicht Abfrageausdrücke Linq zu gut, aber die folgenden sollte es tun:

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

sorry selbe error ... – Sevki

+0

Genau das, was ich gesucht habe. Vielen Dank! – defines

1

Ich landete wie ein foreach tun so

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

dies der einzige Weg, wie ich es zum Arbeiten bekommen konnte..es war nicht, was ich gehofft hatte, hart zu machen.

1

Erstelle einen Konstruktor für SelectLi stItem, das Ihren Wert als GUID akzeptiert und ihn dort anordnet. Rufen Sie nun Ihre Abfrage wie folgt:

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

Sie die Datensätze in der db bekommen können, und schalten Sie sie dann auf eine Liste oder ein Array verwenden ToList() oder ToArray() dann das Objekt verwenden.. Zum Beispiel (es ist 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

Ich denke, das ist die beste Antwort. Sie können '.AsQueryable' auch vor dem Aufruf von' .Select (new SelectListItem (... ' – user1477388

1

ich hatte das gleiche Problem, und ich beenden meine Aufgabe Definition bis zu ändern, um das Problem zu bekommen. Es ist ein komplettes Hack, aber es erlaubt mir, die Daten direkt aus der Abfrage zu füllen:

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

Und die Abfrage funktioniert wie geplant, weil es etwas anderes zu tun, die Konvertierung für sie hat:

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

Es macht das Objekt etwas unordentlicher, erleichtert aber den Umgang mit dem Guid in der Abfrage.