2011-02-04 17 views
8

Zacząłem zajmować się LINQ To SQL i próbuję rozwiązać ten prymitywny problem. Mam bardzo prosty stół z dwiema kolumnami.Wybierz jeden wiersz z LINQ DO SQL

  • Nick - klucz unikalny
  • Hasło

Chciałbym usunąć wiersz z jakąś wartość nick.

użyć tej metody:

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

Problem polega na tym, że muszę użyć user.First(), jeśli chcę tylko jednego wiersza, chciałbym wybierz z LINQ tylko jeden wiersz wiedzieć IEnumerable, ponieważ Nick jest wyjątkowy .

Odpowiedz

15

Spróbuj tego - wystarczy wybrać tylko pierwszy (jeśli występuje), a tylko usunąć, jeśli ma wartość:

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

Dlaczego odłożyłeś próbny odłów, ponieważ zakres został już zadeklarowany przy użyciu bloku użytego, a transakcja zostanie przerwana, jeśli nie zostanie wywołana cała metoda? –

+0

@Davide Piras: pierwotne pytanie już to miało - właśnie to skopiowałem. Ale zgadzam się - to trochę nietypowe - albo złapać i ** obsłużyć ** wyjątek, albo po prostu pozwolić, by to się stało i spaprać w powietrze .... –

+0

@Davide Piras: poprawiono moją odpowiedź - to ma więcej sensu! Jeśli wystąpi wyjątek, osoba dzwoniąca musi się nim zająć –

5

można zrobić:

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

Następnie powinieneś umieścić to wezwanie w próbie .... catch, ponieważ zostanie zbombardowane, gdy nie zostanie znalezione dopasowanie dla 'nick' –

+2

Lub użyj SingleOrDefault, który zwraca wartość zerową (lub raczej wartość domyślną), jeśli nic nie zostanie znalezione . –

+0

Dziękuję, użyłem tego rozwiązania –

0

Dobrze First() jest jeden, który wyodrębni pierwszy (i jedyny) wiersz (plus doda TOP 1 do zapytania). Linq2Sql nie wie, że masz tylko jeden wiersz (lub że masz go w ogóle) i przygotowuje się do otrzymania więcej niż jednego, a więc IEnmuerable, nawet jeśli istnieje jeden wiersz.