2012-07-04 8 views
8

Wykonuję kwerendę sql, która zwraca ciąg znaków - nazwa usługi. to jest zapytanie:Jak mogę przekonwertować IQueryable <string> na ciąg?

IQueryable<string> query = from Comp in ServiceGroupdb.ServiceGroupes 
          where (Comp.GroupID == groupID) 
          select Comp.Name; 

Jak uzyskać ciąg z kwerendy?

+0

Dlaczego deklarujesz odpowiedź jako IQueryable , jeśli oczekujesz tylko jednej odpowiedzi? Czy wiele ciągów może być błędem? Jeśli oczekujesz wielu odpowiedzi, przekonwertuj je na tablicę, a następnie zmień ją, aby zwracała pojedynczy ciąg. – Lazarus

+0

Im oczekuje, aby uzyskać jeden ciąg w wyniku – thechmodmaster

+0

, ale gdy wykonuję: string nazwa = od Comp w ServiceGroupdb.ServiceGroupes gdzie (Comp.GroupID == groupID) wybierz Comp.Name; – thechmodmaster

Odpowiedz

31

LINQ zawsze zwraca sekwencję, więc musisz odzyskać element z niej. Jeśli wiesz, że będziesz mieć tylko jeden wynik, użyj Single(), aby odzyskać ten przedmiot.

var item = (from Comp in ServiceGroupdb.ServiceGroupes 
      where (Comp.GroupID == groupID) 
      select Comp.Name).Single(); 

Istnieją cztery metody LINQ aby pobrać pojedynczy element spośród sekwencji:

  • Single() zwraca pozycję, zgłasza wyjątek, jeśli istnieją 0 lub więcej niż jeden element w sekwencji.
  • SingleOrDefault() zwraca pozycję lub wartość domyślną (null dla string). Zgłasza, jeśli występuje więcej niż jeden element w sekwencji.
  • zwraca pierwszy element. Zgłasza, jeśli w sekwencji jest 0 elementów.
  • FirstOrDefault() zwraca pierwszy element lub wartość domyślną, jeśli nie ma żadnych przedmiotów)
+0

Potwierdź, że działa w moim rozwiązaniu. Dziękuję Ci! – JPK

7

Aby uzyskać pierwszy element w zapytaniu można użyć query.First() ale jeśli nie ma żadnych elementów, które mogłyby rzucić wyjątek . Zamiast tego możesz użyć wartości query.FirstOrDefault(), która da ci pierwszy ciąg lub wartość domyślną (null). W związku z tym zapytanie to zadziała:

var myString = (from Comp in ServiceGroupdb.ServiceGroupes 
       where Comp.GroupID == groupID 
       select Comp.Name) 
       .FirstOrDefault(); 
5

Jesteś prawie na miejscu.

Wystarczy zrobić

IQueryable<string> query = from Comp in ServiceGroupdb.ServiceGroupes where (Comp.GroupID == groupID) select Comp.Name; 
// Loop over all the returned strings 
foreach(var s in query) 
{ 
    Console.WriteLine(s); 
} 

Albo użyć query.FirstOrDefault() jak wspomniano jak dostaniesz tylko jeden wynik.

1

uważam methods'way jest ładniejsza i bardziej przejrzyste, więc o to idzie:

string query = ServiceGroupdb.ServiceGroupes 
       .Where(Comp => Comp.GroupID == groupID) 
       .Select(Comp => Comp.Name) 
       .FirstOrDefault(); 
-1

Wystarczy zrobić to w ten sposób;

var query = from Comp in ServiceGroupdb.ServiceGroupes where (Comp.GroupID == groupID) select Comp.Name; 

zapytanie będzie zawierał twój wynik.

+0

to nie jest odpowiedź, tylko ten sam kod w innym stylu. –

+0

Nie musi używać żadnego innego stylu. Jego zapytanie da ciąg znaków, a ta zmienna zapisze tę zmienną. Jeśli potrafisz uważnie przeczytać to, co powiedział. "zwraca ciąg znaków - nazwa usługi".Nie potrzebuje więc pętli foreach, ponieważ jest to tylko jedna wartość. –

+1

gdzie klauzula zwraca wartość IQueryable ... jedyną różnicą w stosunku do kodu OP jest użycie zmiennej – Alex