2009-10-09 19 views
14

Sto imparando Linq su SQL e ho difficoltà ad afferrarlo. Sto cercando di restituire semplicemente un singolo valore (booleano) in C# con una query Linq.Restituire un singolo valore con Linq a SQL

Voglio vedere se il proprietario di una storia desidera ricevere una notifica via e-mail quando vengono aggiunti nuovi commenti. Vorrei il metodo che contiene il Linq per SQL per restituire un valore booleano.

public bool NotifyOnComment(string username){ 
     var notify = (from s in db.AccountSettings 
         where s.UserName == username 
         select s.NotifyOnComment).DefaultIfEmpty(false); 

     // clueless 
    } 

Aggiornamento:

che sto facendo ora il seguente:

var notify = (from s in db.AccountSettings 
         where s.UserName == username 
         select s.NotifyOnComment).SingleOrDefault(); 

     return (bool)notify; 

risposta

29

Linq, per impostazione predefinita restituisce sempre collezioni. Se è necessario un singolo valore, è possibile applicare i metodi .Single(), .SingleOrDefault() o .First() o .FirstOrDefault().

Sono leggermente diversi in quello che fanno. Single() e SingleOrDefault() funzioneranno solo se c'è esattamente o al massimo un record nel risultato. First() e FirstOrDefault() funzioneranno, anche se ci sono più risultati.

Le varianti *OrDefault() restituiranno il valore predefinito per il tipo nel caso in cui il risultato non contenga record.

+1

Cambia la tua .DefaultIfEmpty (false) per una delle opzioni specificate qui. –

+0

Ora, se c'è una possibilità (e ci sarà) che nessun record esiste ancora. Quale di questi tre sarebbe il migliore in quella situazione? – Mike

+0

Per essere precisi, una soluzione di lavoro potrebbe richiedere qualcosa di più, quindi guarda sotto alla risposta di Justin. Probabilmente ha ottenuto esattamente ciò di cui hai bisogno. – Joey

9
var notify = (from s in db.AccountSettings 
       where s.UserName == username 
       select s.NotifyOnComment).DefaultIfEmpty(false).First(); 

//notify will either hold a bool or the AccountSettings object so 
return (!(notify == false)); // Thanks Nick. Amazing what you'll do in a hurry. 
+0

+1. In realtà hai una soluzione funzionante in contrasto con me :-) – Joey

+3

questo è un classico C# Antipattern (http://stackoverflow.com/questions/1529604/c-antipatterns) dovrebbe essere restituito (! (Notify == false)); –

4
var notify = (from s in db.AccountSettings 
       where s.UserName == username 
       select s.NotifyOnComment).Count(); 

return Convert.ToBoolean(notify); 
Problemi correlati