2011-11-28 14 views
7

Desidero selezionare il mio livello di prezzo nel database per confrontare con un numero intero. Ma è un errore: l'operatore '==' non può essere applicato agli operandi di tipo 'System.Linq.IQueryable' e 'int'. Questo è il mio codice: nonconvert 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"); 
} 

} 

risposta

10

var list_pricelevel

Questo è per definizione un int perché più di una riga può essere restituito.

Non faccio uso di sintassi SQL (solo lambda), ma alla fine si vuole l'equivalente di un .FirstOrDefault o Single o First. Praticamente prendendo la prima fila.

+0

Scusami, puoi spiegarmi chiaramente?Devo aggiungere .First al mio linq? – Nothing

+0

Sì. Perché LINQ non può sapere che ci sarà esattamente una riga lì. Per tutti sa che potrebbero esserci più righe, e invece di un valore 'list_pricelevel' ne otterresti più. –

+0

Grazie TomTom, ora funziona. – Nothing

0

Ecco il mio suggerimento:

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

Ciò potrebbe comportare l'aumento di NullReferenceException nel caso in cui non vi sia alcun articolo in Clienti che soddisfi where c.WebAccount == userName.

Spiegazione:

list_pricelevel è un IEnumerable di elementi soddisfare il vostro clausola dove.

0

È necessario ottenere il primo elemento dalla raccolta.

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

Questo è il bello di Linq che ogni query restituisce un IQueryable in modo da poter rimandare ottenere il risultato finale fino a che realmente deciso ciò che si desidera. Dall'altra parola è possibile eseguire una query su un'altra query :) Quindi, per ottenere i dati reali da una query, è necessario eseguire un comando su di essa che restituisca effettivamente ciò che si desidera. Nel vostro caso, poiché ci si aspetta la query per restituire solo un valore qualsiasi metodo come "FirstOrDefault", "Single" o "First" farà il trucco

1

quando si ha il risultato di espressione LinQ si avrà sempre la lista di risultati.

Quindi nel tuo codice quando si sta eseguendo la query come di seguito:

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

Il list_pricelevel sarà sotto forma di elenco vale a dire l'elenco IQueryable,

in modo da avere per ottenere un solo elemento di controllare con un elemento

usa il codice qui sotto

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. 
Problemi correlati