2009-10-09 6 views
14

J'apprends Linq to SQL et j'ai de la difficulté à le saisir. J'essaye simplement de renvoyer une seule valeur (booléenne) en C# avec une requête Linq.Renvoyer une seule valeur avec Linq to SQL

Je veux voir si le propriétaire d'une histoire aimerait recevoir une notification par courriel lorsque de nouveaux commentaires sont ajoutés. Je voudrais que la méthode qui contient Linq to SQL retourne une valeur booléenne.

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

     // clueless 
    } 

Mise à jour:

que je fais ce qui suit maintenant:

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

     return (bool)notify; 

Répondre

29

Linq, par défaut retourne toujours collections. Si vous avez besoin d'une seule valeur, vous pouvez appliquer les méthodes .Single(), .SingleOrDefault() ouou .FirstOrDefault().

Ils diffèrent légèrement dans ce qu'ils font. Single() et SingleOrDefault() ne fonctionnera que s'il y a exactement ou au plus un enregistrement dans le résultat. First() et FirstOrDefault() fonctionnera, même s'il y a plus de résultats.

Les variantes *OrDefault() renverront la valeur par défaut pour le type dans le cas où le résultat ne contient aucun enregistrement.

+1

Changer votre .DefaultIfEmpty (false) à l'une des options spécifiées ici. –

+0

Maintenant, que se passe-t-il s'il y a une chance (et il y aura) qu'aucun enregistrement n'existe encore. Lequel de ces trois serait le meilleur dans cette situation? – Mike

+0

Pour être précis, une solution de travail pourrait exiger plus que cela, alors regardez ci-dessous la réponse de Justin. Il a probablement eu exactement ce dont vous avez besoin. – 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. En fait vous avez une solution de travail en contraste avec moi :-) – Joey

+3

c'est un classique C# Antipattern (http://stackoverflow.com/questions/1529604/c-antipatterns) devrait être return (! (Notify == false)); –

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

return Convert.ToBoolean(notify);