2011-02-04 21 views
8

LINQ To SQLを扱い始めます。この基本的な問題を解決しようとします。 私は2つの列を持つ非常に単純なテーブルを持っています。LINQ TO SQLを使用して単一行を選択

  • ニック - 私はいくつかのニック値を持つ行を削除したい

ユニークキー、

  • パスワード。

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

    問題は、私は1つの行をしたい場合、私はLINQで1行のみを選択したいと思いニックは一意であるため、IEnumerableを知っているuser.First()を使用しなければならないということです。

    私はこの方法を使用します。

  • 答えて

    15

    これを試してみてください - ちょうど(存在する場合)のみ最初に選択して、あなたが価値得た場合にのみ削除:

    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

    スコープがusingブロックで既に宣言されていて、完全なメソッドが呼び出されないとトランザクションが中止されるため、try-catchを入れたのはなぜですか? –

    +0

    @Davide Piras:オリジナルの質問には既にそれがありました - 私はそれをコピーしました。しかし、私は同意します - これはちょっとだけです - 例外をキャッチして**処理するか、例外を処理するか、それを起こさせてバブルアップしてください。 –

    +0

    @Davide Piras:私の答えを修正しました。もし例外が発生した場合、呼び出し側はそれに対処する必要があります –

    5

    あなたが行うことができます。

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

    次に、この呼び出しをtry .... catch内に置く必要があります。なぜなら、 'nick'に一致するものが見つからない場合に爆発するからです。 –

    +2

    または何も見つからない場合はnullを返すSingleOrDefaultを使用します。 –

    +0

    ありがとう、私はこのソリューションを使用 –

    0

    まあ最初に()であります1つは最初の(そして唯一の)行を抽出します(それに加えて、TOP 1をクエリに追加します)。 Linq2Sqlは、あなたが1つの行しか持っていないことを知らず、複数行を受け取る準備をしているので、行が1つでもあってもIEnmuerableです。

    関連する問題