2011-11-28 45 views
7

Quiero seleccionar mi nivel de precios en la base de datos para comparar con un número entero. Pero es un error: el operador '==' no se puede aplicar a los operandos de tipo 'System.Linq.IQueryable' e 'int'. Este es mi código: noconvertir IQueryable <int> a <int>

if (Request.IsAuthenticated){ 

CustomerModels cm = new CustomerModels(); 

string userName = Page.User.Identity.Name; 
var list_pricelevel = from c in cm.DataContext.Customers 
         where c.WebAccount == userName 
         select c.PriceLevel; 
if (list_pricelevel == 3) { 
    Response.Write("Welcome"); 
} 

} 

Respuesta

10

var list_pricelevel

Ésta es, por definición, un int porque más de una fila puede ser devuelto.

No utilizo la sintaxis SQL (solo lambda) pero al final quiero el equivalente a .FirstOrDefault o Single o First. Básicamente tomando la primera fila.

+0

Disculpe, ¿puede explicarme claramente?¿Debo agregar. Primero a mi linq? – Nothing

+0

Sí. Porque LINQ no puede saber que habrá exactamente una fila allí. Por lo que sabe, puede haber varias filas, y en lugar de un valor de 'list_pricelevel' obtendrías varias de ellas. –

+0

Gracias TomTom, ahora funciona. – Nothing

0

Aquí es sugerencia:

if (list_pricelevel.First() == 3) 
{ 
     Response.Write("Welcome"); 
} 

Esto puede aumentar una NullReferenceException en caso de que no haya ningún artículo en Customers que satisfaga where c.WebAccount == userName.

Explicación:

list_pricelevel es un IEnumerable de artículos de la satisfacción de su cláusula where.

0

Necesita obtener el primer artículo de su colección.

if (list_pricelevel.First() == 3) { 
    Response.Write("Welcome"); 
} 
0

Esa es la belleza de LINQ que cada consulta devuelve IQueryable para que pueda aplazar conseguir el resultado final hasta que realmente decidido lo que quiere. En la otra palabra, puede ejecutar una consulta sobre otra consulta :) Por lo tanto, para obtener los datos reales de una consulta debe ejecutar un comando sobre ella que realmente devuelve lo que desea. En su caso, ya que espera que su consulta devuelva solo un valor, cualquier método como "FirstOrDefault", "Single" o "First" hará el truco

1

cuando tenga el resultado de la expresión LinQ siempre tendrá el lista de conjunto de resultados.

Así que en su código cuando se está consultando la siguiente manera:

var list_pricelevel = from c in cm.DataContext.Customers where c.WebAccount == userName select c.PriceLevel;

El list_pricelevel será en forma de lista es decir, la lista IQueryable,

Así que hay que tener sólo un elemento de comprobar con un elemento

a fin de utilizar el código de abajo:

if (list_pricelevel.Single() == 3) 
{ 
    Response.Write("Welcome"); 
} 

or 

if (list_pricelevel.First() == 3) 
{ 
    Response.Write("Welcome"); 
} 


both the above code gives you only one result set value so you can equate with 3 for validation. 
Cuestiones relacionadas