2011-02-04 13 views
8

Inizio a trattare con LINQ A SQL e provo a risolvere questo problema primitivo. Ho una tabella molto semplice con due colonne.Selezionare una riga singola con LINQ TO SQL

  • Nick - chiave, unico
  • password

Vorrei eliminare la riga con un certo valore nick.

Io uso questo metodo:

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(); 
     } 
    } 

Il problema è che devo usare user.First() se voglio una singola riga, vorrei selezionare con LINQ una sola fila conoscere IEnumerable, perché Nick è unica .

risposta

15

Prova questo - basta selezionare solo la prima (se presente), e cancellare solo se si ha un valore:

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

Perché hai inserito il try-catch poiché l'ambito è già dichiarato con il blocco using e la transazione verrà interrotta se non viene chiamato il metodo completo? –

+0

@Davide Piras: la domanda originale era già quella - l'ho appena copiato. Ma sono d'accordo - questo è un po 'off - o prendi e ** gestisci ** l'eccezione, o poi lascia che accada e bolla ... –

+0

@Davide Piras: risolta la mia risposta - questo ha più senso! Se si verifica un'eccezione, il chiamante deve affrontarlo –

5

si può fare:

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

Quindi dovresti mettere questa chiamata dentro il try .... catch visto che verrà bombardato quando non viene trovata alcuna corrispondenza per 'nick' –

+2

Oppure usa SingleOrDefault, che restituisce un valore null (o meglio il valore predefinito) se non viene trovato nulla . –

+0

Grazie, ho usato questa soluzione –

0

Ben prima() è la uno che estrarrà la prima (e unica) riga (più aggiungerà TOP 1 alla query). Linq2Sql non sa che hai solo una riga (o che ne avrai affatto) e ti stai preparando a riceverne più di una, quindi IEnmuerable anche quando c'è una riga.