2011-08-25 7 views
7

LINQを使用するコレクションに対して一括更新する方法はありますか?現在のところList<myObject>があり、リストのすべての行に対してcolumn1をTESTに更新したい場合は、foreachループを設定し、各オブジェクトに対して値を設定して保存します。これはうまく動作しますが、そこにLINQメソッドがあるかどうか疑問に思っていたところで、myOject.BulkUpdate(columnName, value)のようなことができましたか?LINQ to SQLを使用した一括更新

+1

あなたは、LINQ-TO-SQLについて話していますか? –

+0

XMLをバルクデータとして使用してバルク更新を行うストアドプロシージャには常に戻りましたが、LINQで可能かどうかを知りたいと思います。 –

答えて

5

LINQ To SQLを使用しているような音がしており、既に基本的なレイアウトが用意されています。

LINQ To SQLは、テーブルをクラスに抽象化することを目的としており、実際には「銀色の弾丸」やワンライナーを提供していません。

これを実行する唯一の方法は、ストアドプロシージャを作成して列名と新しい値を取得し、そのロジックを実装することです。

db.MassUpdateTableColumn("Customer", "Name", "TEST"); 

.... 
CREATE PROC MassUpdateTableColumn 
    @TableName varchar(100), @ColumnName varchar(100), @NewVal varchar(100) 
AS 
    /*your dynamic SQL to update a table column with a new val. */ 

そうでない場合、それはあなたが説明するようだ:

List<Customer> myCusts = db.Customers.ToList(); 
foreach(Customer c in myCusts) 
{ 
    c.Name = "TEST"; 
}  
db.SubmitChanges(); 
+0

はい私はこれを行う方法を理解しています。私の質問は、より合理化されたLINQ機能があるかどうか尋ねるだけです。 – esastincy

1

LINQをSQLに(またはEFそのことについては)、それらすべてを操作し、メモリ内にオブジェクトをもたらすことについてです、各行ごとに個別のデータベース要求を使用して更新します。

クライアント上でオブジェクト全体を水和する必要がない場合は、LINQの代わりにサーバー側の操作(ストアドプロシージャ、TSQL)を使用する方がはるかに優れています。 LINQプロバイダを使用して、データベースに対してTSQLを発行できます。たとえば、LINQ to SQLを使用すると、context.ExecuteCommand( "テーブルのフィールドを更新する値=条件式")を使用できます。ちょうどSQL Injectionに気を付けてください。

9

あなたの要件は、Linqの表現とこのトピックに関するTerry Aneyの優れたライブラリを使用して完全に可能です。

Batch Updates and Deletes with LINQ to SQL

次のように与えた例の面で更新は次のようになります。

using BTR.Core.Linq; 
... 

Context.myObjects.UpdateBatch 
(
    Context.myObjects.Where(x => x.columnName != value), 
    x => new myObject { columnName = value} 
); 

編集(2017年1月20日):それは、これが利用可能になりました何の価値がありますNuGetパッケージ@https://www.nuget.org/packages/LinqPost/の形式で提供されます。

Install-Package LinqPost 
+2

RBARを避けるために、最初の答えは本当に正しいわけではありません。 – Jasmine

関連する問題