2009-05-23 13 views
0

LINQで次のステートメントを実行する方法について、誰か知っていますか?LINQからSQLへの更新

UPDATE FileEntity SET DateDeleted = GETDATE() WHERE ID IN (1,2,3) 

私はLINQの愛と憎しみの両方に出くわしましたが、それまではほとんどうまく機能しませんでした。私が避けたいのは、すべてのファイルエンティティを列挙して手動で設定することです。

foreach (var file in db.FileEntities.Where(x => ids.Contains(x.ID))) 
{ 
    file.DateDeleted = DateTime.Now; 
} 
db.SubmitChanges(); 

かなりのオーバーヘッドを除いて、上記のコード、の問題点は、各エンティティが大きい更新用データランの多くはない特定のデータベース接続を横切るように、かなり大きい可能なデータフィールドを有することがあります理由。 (LINQソリューションはDataプロパティの読み込みを遅らせることですが、フィールドをLINQからSQLに更新する方法がある場合は必要ありません)。

私は上記のT-SQLにつながるいくつかのクエリ式プロバイダの事を考えている...

答えて

2

LINQは、店舗のアップデートで実行することはできません - それは、統合言語クエリ、更新ではありません。ほとんどの(多分すべての)ORマッパーはselectステートメントを生成してデータをフェッチし、メモリー内で変更し、別の更新ステートメントを使用して更新を実行します。スマートORマッパーは、追加のデータが必要になるまで主キーのみをフェッチしますが、一度に1つの属性だけをフェッチするのは非常にコストがかかるため、通常は残りの部分をフェッチします。

この最適化に本当に関心がある場合は、ストアドプロシージャまたは手書きのSQLステートメントを使用してください。 compacterコードが必要な場合は、以下を使用できます。

db.FileEntities. 
    Where(x => ids.Contains(x.ID)). 
    Select(x => x.DateDeleted = DateTime.Now; return x;); 

db.SubmitChanges(); 

私はそれが読みにくいと思うので、私はこれが好きではありませんが、そのような解決策を好む人もいます。

0

LINQ to SQLは他のものと同様にORMであるため、一括更新/挿入/削除を処理するようには設計されていません。 L2S、EF、NHibernate、LLBLGenなどの一般的なアイデアは、リレーショナルデータとオブジェクトグラフのマッピングを処理し、格納されたprocsの大きなライブラリを管理する必要がなくなり、柔軟性と適合性を制限します。

一括アップデートに関しては、データベースサーバーの中でベストなことをするのが一番です。 L2SとEFの両方は、ストアドプロシージャをモデルにマップする機能を提供します。これにより、ストアドプロシージャを幾分エンティティ指向にすることができます。 L2Sを使用しているので、IDのセットを入力とするprocを作成し、質問の冒頭でSQL文を実行します。保存したprocをL2Sモデルにドラッグして呼び出します。

これは、手元にある問題の最適な解決方法であり、一括アップデートです。レポートと同様に、オブジェクト・グラフやオブジェクト・リレーショナル・マッピングは、バルク・プロセスにとって最適なソリューションではありません。

関連する問題