2009-08-02 13 views
1

最近Linqを使用してC#アプリケーションを開発しました。 私は処理する必要のあるプロファイルのリストを外部データベースから取得しています。新しいものと、データベースに既に存在し、更新が必要なものがあります。 私が今日していることは、プロファイルリストを調べて、各プロファイルが存在すればそれをチェックします。それ以外の場合は更新します。このソリューションはうまくいきます。Visual Studio C#Linqバルク挿入/更新

私は、取得したファイルが巨大で一括挿入/更新がより良いパフォーマンスを持つことが知られているので、この方法でUPDATE ON DUPLICATEのような一括挿入/更新を使用する方法があると確信しています。私は今使っている反復を避けたいと思います。

insertallは、私は両方の更新の組み合わせを必要とし、すでに格納されている行のために働き、あなたの助けが高く評価され、ここで

私のコードは挿入されません。

foreach (Profile tmpProfile in profiles) 
      { 
       try 
       {      
        var matchedProfile = (from c in db.ProfileEntities 
              where c.ProfileId == tmpProfile.Id 
              select c).SingleOrDefault(); 

        if (matchedProfile == null) 
        { 
         //Insert 
         db.ProfileEntities.InsertOnSubmit(EntityMapper.ToEntity(tmpProfile)); 

        } 
        else 
        { 
         //Update 
         EntityMapper.ToEntity(ref matchedProfile, tmpProfile);       

        }            
       } 
       catch (System.Data.SqlServerCe.SqlCeException sqlExec) 
       {      

       } 
       catch (Exception e) 
       { 

       } 
      } 

      db.SubmitChanges(); 

答えて

2

一つの可能​​な最適化は、あなたが外部アプリケーションからの持っているすべての項目のリストを作成し、一度に一致したデータベースからすべての項目を読んで、代わりに複数のラウンドトリップを行うことであろう。

これらのすべてを更新し、残っているものをすべて挿入して最後にSubmitChangesを呼び出すと、外部で取得されたプロファイルごとに1回ではなく、データベースへの2回のラウンドトリップが発生します。

私はそれは私がデータベースに配置されているかを決定するために項目のリストを反復処理する必要があり、その後、一つ一つを更新します意味任意の一括更新を知っているか

+0

をLINQ to SQLでの機能を挿入しないでくださいそれはより良いと思いますか? – user149318

+0

こんにちはありがとうございます データベースで大きなヒットを行い、それを繰り返すことによるパフォーマンスの低下は、データベースへの多数の小さな呼び出しよりも少なくなります。 ネットオプティマイゼーションが必要です。 – Joon

+0

このような最適化を行うにはどうすればよいですか?私はバルクが望ましいという事実を認識していますが、LINQを使ってそれを行う方法がありますか?バルク操作での挿入と更新の両方で – user149318

関連する問題