2016-12-29 7 views
1

テーブル "contacts"を持つSQL Serverがあります。このテーブルには、 "int"型の列があります。クエリを行わずにその値を増やしたいです。そこに提案された解決策は、問題がEntityFramework.ExtendedのようなことにそのないのIQueryable拡張であり、それはそれは難しい私のために実現することができるEntityFramework.Utilities を使用している 「Entity framework update one column by increasing the current value by one without select」:Entity Frameworkクエリを使用せずに列の値をインクリメント

これはのコピーです。

質問はIQueryable(SQLクエリを実際に書くことなく)を使用してSQLのint値をincrementmenetする方法はありますか?

のIQueryableクエリの結果は次のようになります。

UPDATE Contacts SET clicks=clicks+1 WHERE id=8432 
+0

見るSQL ServerのSEQUENCEのための; https://msdn.microsoft.com/en-us/library/ff878091.aspx – Mehmet

+0

エンティティフレームワークでSQL Server SEQUENCEを使用する簡単な方法が見つかりませんでした – HaimYuhter

+0

ハンマーを使用してネジを駆動しようとしています。あなたが求めているのは、配列、ID、またはエンティティとは関係ありません。つまり、オブジェクトやマッピングがないため、ORMは必要ありません。正しい方法は、たとえば、eSQLまたは未加工SQLを使用して、パラメータを使用してUPDATE文を実行することです。さらに良い方法は、ストアドプロシージャを作成して呼び出すことです。 –

答えて

2

私はいくつかの研究とテストの後に解決策を見つけ、実際にEntityFramework.Extendedは、私はそれが何をしたい正確に何を、あなたが列をインクリメントしたい場合は、単に割り当てを追加してUpdateメソッドを呼び出します。

db.Contacts.Where(c => c.Id == id).Update(c => new Contact { Clicks = c.Clicks + 1 }); 

EntityFramework.Extendedのソースコードを確認してデバッグしたところ、最後に実行されたクエリが正確に私が望むものであることがわかりました 解決策は私の鼻の下にありました。 )

0

あなたは、エンティティフレームワークを使用してやろうとしているものと同等のは、この

context.Contacts.Single(c => c.id == 8432).clicks += 1; 
context.SaveChanges(); 

これが見つけたようなものを書くことになります更新したいレコードが列の値を1だけインクリメントします。私はSQL文を自分で書いていませんが、EFは自分のコードをバックグラウンドでSQL文に変換する必要があります。クエリは引き続き使用されました

常に両方の操作を実行したい場合は、dbContextの拡張メソッドを作成してみてください。このようなもの;

public static void IncrementClicks(this MyContextType context, int id) 
    { 
     context.Contacts.Single(c => c.id == id).clicks += 1; 
     context.SaveChanges(); 
    } 

次に、このようなものを使用できます。

context.IncrementClicks(8432); 
+0

あなたはこれが正しいと思いますが、これは私が何をしようとしているのかを確認する簡単な方法ですが、問題はこれが2つのクエリに変換され、選択肢と別のものに変換されます。シーケンスがありません – HaimYuhter

+1

これは元のコードと同じではありません。元のコードは並行性の違反を受けません*。このコードは、使用される並行性モデルに従って、不良データまたは例外につながることが保証されています。オリジナルのクエリと同等ののは、単にEFを介して生のSQLを実行するか、ストアドプロシージャを作成してマップすることです –

関連する問題