2012-07-04 19 views
8

Hago una consulta SQL que devuelve una cadena - nombre del servicio. esta es la consulta:¿cómo puedo convertir IQueryable <string> en una cadena?

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

¿Cómo obtengo el hilo de la consulta?

+0

¿Por qué declara la respuesta como IQueryable si solo espera una respuesta única? ¿Se considerarían cadenas múltiples un error? Si espera respuestas múltiples, conviértalo en una matriz, explíquelo en su consulta y cámbielo para devolver una sola cadena. – Lazarus

+0

Estoy esperando obtener una cadena como resultado – thechmodmaster

+0

pero cuando lo hago: string name = from Comp en ServiceGroupdb.ServiceGroupes donde (Comp.GroupID == groupID) seleccionamos Comp.Name; – thechmodmaster

Respuesta

31

LINQ siempre devuelve una secuencia, por lo que debe recuperar el elemento. Si sabe que tendrá un solo resultado, use Single() para recuperar ese elemento.

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

Hay cuatro métodos de LINQ para recuperar un único elemento fuera de una secuencia:

  • Single() devuelve el artículo, produce una excepción si hay 0 o más de un elemento de la secuencia.
  • SingleOrDefault() devuelve el artículo, o el valor predeterminado (null para string). Lanza si hay más de un elemento en la secuencia.
  • First() devuelve el primer elemento. Lanza si hay 0 elementos en la secuencia.
  • FirstOrDefault() devuelve el primer elemento, o el valor por defecto si no hay elementos)
+0

Puedo confirmar que funciona en mi solución. ¡Gracias! – JPK

7

Para obtener el primer elemento de la consulta, puede utilizar query.First() pero si no hay elementos, que lanzaría una excepción . En su lugar, puede usar query.FirstOrDefault(), que le proporcionará la primera cadena o el valor predeterminado (null). Por lo tanto, para su consulta esto funcionaría:

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

Ya casi está allí.

Eso sí,

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 uso query.FirstOrDefault() como se ha mencionado ya que sólo se obtendrá un resultado.

1

encuentro la methods'way es más bonita y más clara, así que aquí va:

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

Sólo hacerlo de esta manera;

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

consulta entonces contendrá el resultado.

+0

esta no es la respuesta, solo el mismo código en un estilo diferente –

+0

No necesita usar ningún estilo diferente. Su consulta arrojará una cadena y esta variable almacenará esa variable. Si puedes leer cuidadosamente lo que ha dicho. "devuelve una cadena - nombre del servicio".Entonces él no necesita ningún bucle foreach, porque es solo un valor. –

+1

donde cláusula devuelve IQueryable ... la única diferencia del código de OP es el uso de var – Alex

Cuestiones relacionadas