2009-04-10 9 views
1

読み込んだcsvに基づいていくつかのレコードを更新して挿入したいと思います。挿入は問題ではありませんが、1つのステートメントで多数のデータを更新する方法はありますか?私はそれらに参加する方法を明確にしていない。名前= t.NameについてはLINQ:UPDATEのように更新を実行する方法<T> SET更新(<T>,)LINQのSELECT FROM句?

Update Item 
Set 
    Name = t.Name 
From 
    Item i, TextFile t 
Where 
    i.ItemNo = t.ItemNo 

私は、更新のためのロジックが存在するプライベート項目UpdateItem(Item originalItem, Item newItem)を作成しました。

私はこの関数を呼び出し、変更されたレコードでdb.SubmitChanges()を実行することを知りたいと思います。

助けてください。

答えて

1

私は、TextFileがCSVファイルから読み取ったオブジェクトのメモリコレクションであり、Itemsがデータベースのデータコンテキストのテーブルであると仮定しています。その場合、データベースからメモリ内のコレクションにすべての項目を最初にフェッチせずに実際の結合を行うことはできないと思います。これはコストのかかる操作です。以下のサンプルでは、​​これらのアイテムだけを選択し、テキストファイルの新しい名前が新しいコレクションに一致するように選択し、そのコレクションを反復してアイテムに名前を設定します。 UpdateItemメソッドは使用されません。

var textFile = ...collection of objects from CSV... 

var textIDs = textFile.Select(t => t.ItemNo); 

using (var db = new DataContext()) 
{ 
    var toUpdate = db.Items 
        .Where(i => textIDs.Contains(i.ItemNo)) 
        .ToList() // <--- this will force the query 
        .Select(i => new 
        { 
         Item = i, 
         NewName = textFile.Where(t => t.ItemNo == i.ItemNo) 
              .Single() 
              .Name 
        }); 

    foreach (var item in toUpdate) 
    { 
     item.Item.Name = item.NewName; 
    } 

    db.SubmitChanges(); 
} 
+0

ご協力いただきありがとうございます。確かに高価です。 VARアップデート= db.Item.Where(outerItem)におけるIから がi.ItemNoにテキストファイル内のTに参加するt.ItemNo新しい選択 等しい{ OriginalItem = I、 NewItem = T }。 foreach(更新のvarアイテム) UpdateItem(item.OriginalItem、item.NewItem); –

+0

ただし、エラー:Contains()演算子以外のクエリ演算子のLINQ to SQL実装ではローカルシーケンスを使用できません –

+0

Ok。選択の前にToListを追加します。 – tvanfosson

関連する問題