2009-10-09 31 views
14

Estoy aprendiendo Linq a SQL y estoy teniendo problemas para comprenderlo. Intento simplemente devolver un valor único (booleano) en C# con una consulta Linq.Devolviendo un único valor con Linq a SQL

Quiero ver si al propietario de una historia le gustaría recibir una notificación por correo electrónico cuando se agregan nuevos comentarios. Me gustaría que el método que contiene el Linq a SQL devuelva un valor booleano.

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

     // clueless 
    } 

Actualización:

que estoy haciendo ahora lo siguiente:

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

     return (bool)notify; 

Respuesta

29

LINQ, por defecto siempre devuelve colecciones. Si necesita un valor único, puede aplicar los métodos .Single(), .SingleOrDefault() o .First() o .FirstOrDefault().

Difieren ligeramente en lo que hacen. Single() y SingleOrDefault() solo funcionarán si hay exactamente o como máximo un registro en el resultado. First() y FirstOrDefault() funcionarán, incluso si hay más resultados.

Las variantes *OrDefault() devolverán el valor predeterminado para el tipo en caso de que el resultado no contenga registros.

+1

Cambiar la .DefaultIfEmpty (falso) a una de las opciones especificadas aquí. –

+0

Ahora, ¿qué pasa si hay una posibilidad (y habrá) de que todavía no exista ningún registro? ¿Cuál de los tres sería el mejor en esa situación? – Mike

+0

Para ser precisos, una solución de trabajo puede requerir más que solo eso, por lo tanto, mire a continuación la respuesta de Justin. Probablemente obtuvo exactamente lo que necesita. – 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 realidad, tienes una solución que funciona en contraste conmigo :-) – Joey

+3

este es un clásico Antisuero C# (http://stackoverflow.com/questions/1529604/c-antipatterns) debe ser devuelto (! (Notificar == falso)); –

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

return Convert.ToBoolean(notify); 
Cuestiones relacionadas