2012-07-04 20 views
8

Faccio una query sql che restituisce una stringa - nome del servizio. questa è la query:Come posso convertire IQueryable <string> in stringa?

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

Come si ottiene la stringa fuori dalla query?

+0

Perché si dichiara la risposta come IQueryable se si prevede una risposta singola? Sarebbe considerato un errore più stringhe? Se ti stai aspettando più risposte, allora converti in un array altrimenti sii esplicito nella tua query e cambialo per restituire una singola stringa. – Lazarus

+0

mi aspettavo di ottenere una stringa come risultato – thechmodmaster

+0

ma quando faccio: string nome = da Comp in ServiceGroupdb.ServiceGroupes dove (Comp.GroupID == groupID) selezionare Comp.Name; – thechmodmaster

risposta

31

LINQ restituisce sempre una sequenza, quindi è necessario recuperare l'elemento da esso. Se sai che avrai un solo risultato, usa Single() per recuperare quell'elemento.

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

Esistono quattro metodi di LINQ per recuperare un singolo elemento su una sequenza:

  • Single() restituisce l'elemento, genera un'eccezione se ci sono 0 o più elementi nella sequenza.
  • SingleOrDefault() restituisce l'elemento o il valore predefinito (null per string). Getta se più di un oggetto nella sequenza.
  • First() restituisce il primo elemento. Genera se ci sono 0 elementi nella sequenza.
  • FirstOrDefault() restituisce il primo elemento, o il valore di default se non ci sono elementi)
+0

Posso confermare che funziona nella mia soluzione. Grazie! – JPK

7

per ottenere il primo elemento nella query, è possibile utilizzare query.First(), ma se non ci sono elementi, che avrebbe gettato un'eccezione . Invece, è possibile utilizzare query.FirstOrDefault() che fornirà la prima stringa o il valore predefinito (null). Quindi per la tua ricerca ciò funzionerebbe:

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

Sei quasi arrivato.

Basta fare

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); 
} 

O utilizzare query.FirstOrDefault() come detto, come si otterrà un solo risultato.

1

trovo il methods'way è più bella e più chiara, così qui va:

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

Basta fare in questo modo;

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

la query conterrà quindi il risultato.

+0

questa non è la risposta, solo lo stesso codice in uno stile diverso –

+0

Non ha bisogno di usare uno stile diverso. La sua query produrrà una stringa e questa variabile memorizzerà quella variabile. Se riesci a leggere attentamente ciò che ha detto. "restituisce una stringa - nome del servizio".Quindi non ha bisogno di alcun ciclo foreach, perché è solo un valore. –

+1

dove clausola restituisce IQueryable ... solo la differenza dal codice OP è l'utilizzo di var – Alex

Problemi correlati