2011-02-04 31 views
8

Empiezo a tratar con LINQ To SQL y trato de resolver este problema primitivo. Tengo una tabla muy simple con dos columnas.Seleccionar una sola fila con LINQ TO SQL

  • Nick - clave, único
  • contraseña

quisiera eliminar fila con un valor nick.

que utiliza este método:

public void DeleteSpiritUser(string nick) 
    { 
     var user = from u in _dc.Spirit_Users where u.Nick == nick select u; 

     using (var scope = new TransactionScope()) 
     { 
      _dc.Spirit_Users.DeleteOnSubmit(user.First()); 

      try 
      { 
       _dc.SubmitChanges(); 
      } 
      catch (Exception exception) 
      { 
       throw exception; 
      } 
      scope.Complete(); 
     } 
    } 

El problema es que debo usar user.First() si quiero una sola fila, me gustaría seleccione con LINQ sólo una fila saber IEnumerable, porque Nick es único .

Respuesta

15

Prueba esto - sólo tiene que seleccionar sólo la primera (si está presente), y sólo se elimina si tiene un valor:

public void DeleteSpiritUser(string nick) 
{ 
    var user = (from u in _dc.Spirit_Users 
       where u.Nick == nick 
       select u).SingleOrDefault(); 

    if(user != null) 
    { 
     using (var scope = new TransactionScope()) 
     { 
      _dc.Spirit_Users.DeleteOnSubmit(user); 
      _dc.SubmitChanges(); 
      scope.Complete(); 
     } 
    } 
} 
+0

¿Por qué pones el try-catch ya que el alcance ya está declarado con el bloque using y la transacción se cancelará si no se llama al método completo? –

+0

@Davide Piras: la pregunta original ya lo tenía, simplemente lo copié. Pero estoy de acuerdo, esto es un poco desacertado, capturar y ** manejar ** la excepción, o simplemente dejar que ocurra y burbujear ... –

+0

@Davide Piras: arreglé mi respuesta, ¡esto tiene más sentido! Si ocurre una excepción, la persona que llama necesita tratar con ella –

5

que puede hacer:

var user = _dc.Spirit_Users.Single(u => u.Nick == nick); 
+0

Luego debes poner esta llamada dentro del try .... catch ya que se disparará cuando no se encuentre coincidencia para 'nick' –

+2

O usa SingleOrDefault, que devuelve un valor nulo (o más bien el predeterminado) si no se encuentra nada . –

+0

Gracias, usé esta solución –

0

Bueno primero() es el uno que extraerá la primera (y única) fila (además, agregará TOP 1 a la consulta). Linq2Sql no sabe que solo tiene una fila (o que tendrá alguna) y se está preparando para recibir más de una, por lo tanto, IEnmuerable incluso cuando hay una fila.