2010-03-25 23 views
13

Cześć to wydaje się, że powinna działać,LINQ Guid toString()

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

Kiedy próbuję to zrobić to nie działa dać mi błąd

LINQ do podmiotów nie rozpoznaje metoda "System.String ToString()" metoda, a tej metody nie można przetłumaczyć na wyrażenie magazynu.

Czy istnieje obejście?

+0

Z którego zakresu pochodzą "Nazwa" i "SomeGuid"? To nie jest jasne. – spender

+0

Przepraszam .. czy to lepiej? – Sevki

Odpowiedz

5

Nie wszystkie metody CLR mogą być używane w przypadku Linq-to-Entities. ToString() wydaje się być jednym z nich.

Spójrz na CLR Method to Canonical Function Mapping.

Może spróbuj ustawić GUID na zmienną łańcuchową jawnie, poza linq.

string myGuid = SomeGuid.ToString(); 

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

nie mówię Linq wyrażeń zapytań zbyt dobrze, ale następujący powinno załatwić sprawę:

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

Przepraszam, ten sam błąd ... – Sevki

+0

Dokładnie to, czego szukałem. Wielkie dzięki! – defines

1

skończyło się robi jak foreach tak

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

to jedyny sposób, w jaki mogłem go uruchomić ... nie było to, co miałem nadzieję zrobić ciężko ..

1

Utwórz konstruktor dla SelectLi STItem, który akceptuje twoją Wartość jako Guid i ToString tam. Teraz nazywają zapytanie tak:

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

Można uzyskać rekordy w db, a następnie włączyć je do listy lub użycia array ToList() lub ToArray(), a następnie użyć obiektu.. Na przykład (jest LINQ do podmiotów):

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

Myślę, że to najlepsza odpowiedź. Możesz również użyć '.AsQueryable' przed wywołaniem' .Select (new SelectListItem (... ' – user1477388

1

miałem ten sam problem, a skończyło się na zmianę definicji mojego obiektu, aby obejść ten problem. Jest to kompletne hack, ale to pozwala mi wypełnić dane prosto z zapytaniem:

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

I kwerendy działa zgodnie z przeznaczeniem, ponieważ ma coś innego robi konwersję do niego:

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

to sprawia, że ​​obiekt jest nieco bardziej nieuporządkowany, ale znacznie ułatwia rozwiązywanie problemu z Guidem w zapytaniu.