2016-07-20 19 views
0

データベースにレコードを挿入する機能があります。私はデータベースに重複したエントリがないことを確認したい。関数は、まずクエリ文字列パラメータがあるかどうかをチェックします。存在する場合、それは編集モード、そうでなければ挿入モードのように機能する。データベースに現在追加されているレコードを返す関数があります。データベースに挿入する前に、2つの列に基づいて重複をチェックする必要があります。コレクションでLINQを使用して複製を確認する

myService = new myService(); 
    myFlow mf = new myFlow(); 
    if (!string.IsNullOrEmpty(Request["myflowid"])) 
    { 
     mf = myService.Getmyflow(Convert.ToInt32(Request["myflowid"])); 
    } 
    int workcount = 0; 
    int.TryParse(txtWorkCount.Text, out workcount); 
    mf.Name = txtName.Text.Trim(); 
    mf.Description = txtDescription.Text.Trim(); 
    mf.FunctionCode = txtFunctioneCode.Text.Trim(); 
    mf.FunctionType = txtFunctioneType.Text.Trim(); 
    mf.WorkCount = workcount; 

    if (mf.WorkFlowId == 0) 
    { 
     mf.SortOrder = 0; 
     mf.Active = true; 
     mf.RecordDateTime = DateTime.Now; 
     message = "Saved Successfully"; 
    } 
    else 
    { 
     _editMode = true; 
     message = "Update Successfully"; 
    } 
} 

int myflowId = mfService.AddEditmyflow(mf); 

私はfunctiontypefunctioncodeに基づいて重複を確認したいです。別の関数mfService.Getmyflows()は、データベースに現在追加されているレコードを返すことができます。

Linqを使用して重複をチェックするにはどうすればよいですか?

+0

I使用することをお勧めします[エンティティフレームワーク](https://msdn.microsoft.com/en-us/data/ ef.aspx)(理解しやすく、数百ものチュートリアル)を使用してデータベースとデータを処理します。また、DuplicateKeyExceptionがスローされ、捕捉される可能性があるデータベースでCompositeキーを使用できるとも言えます。 –

答えて

0

まず、どのデータベースを使用しますか?多くのデータベースではアップサンプリングの動作がサポートされています(検出されたデータに応じて更新または挿入されます)。たとえば、MERGE in ms sql,MERGE in oracle,INSERT .. ON DUPLICATE in mysqlなどとなります。これは好ましい解決策である可能性があります。 Upsertは通常、アトミックな操作です。

あなたの特定のケースでは取引しますか?重複を確認した後、レコードを挿入する前に誰もデータを挿入しないことは確かですか?例:

#1 thread    #2 thread 

look for duplicates 
...      look for duplicate 
no duplicates found  ... 
         no duplicates found 
insert data_1 
         insert data_1 

これは、回避しようとする重複で終了します。

あなたのコードによれば、GUIからデータを入力し、1つの項目だけを追加します。

myServiceコードにアクセスできる場合は、mfService.Getmyflows()ですべてのアイテムをクエリし、コード内でこのコレクションを調べる代わりに、2つの列でアイテムをクエリするメソッドを追加できます。パフォーマンスが向上し(特に、その列に索引がある場合)、より効率的なメモリーが得られます。

は最後に、コレクション内の単一の要素の既存簡単に行うことができます。

var alreadyExist = mfService.Getmyflows() 
          .Any(x => x.Column1 == value1 && x.Column2 == value2); 
+0

@MachineLearningこのコードが実行されている間、データコンテキストが生きているかどうかは不明です。例えば、 'Getmyflows'メソッドの中で作成して解放することができます。さらに、linq-to-sql、エンティティフレームワーク、またはその他のorm経由でデータベースにアクセスする状態はありません。また、 'Chaos'分離レベルを持つ' TransactionScope'もあります。投稿されたコードの外で何が起こっているのかわからない。 – lorond

関連する問題