0

LINQ を使用してデータベースにレコードを挿入しています。これらのレコードを作成し、リストを使用してそれらを追跡します。いくつかのロジックに基づいて、リストから削除することでレコードの一部を削除します。(同じ DataContext オブジェクトを使用しています)。

データベースにレコードを挿入する場合は、対応する linq テーブルの InsertOnSubmit() に続いて、datacontext オブジェクトで SubmitChanges() を実行します。LINQ は、リストに存在するレコードと共に、リストから削除されたレコードも挿入します。

例:

//list to keep track of records to insert
List list

// add the records to list
list.add(some records)

//deleted last 2 records
list.remove()

//call InsertAllOnSubmit on the linq table passing the list object with records to insert
linqTable.InsertAllOnSubmit(list)

//call SubmitChanges on datacontext object
datacontext.SubmitChanges()

この msdn 記事Object States and Change-Tracking (LINQ to SQL) に出くわしました

InsertOnSubmit を使用して、挿入を明示的に要求できます。または、LINQ to SQLLINQ to SQL は、更新する必要がある既知のオブジェクトの 1 つに接続されているオブジェクトを見つけることによって、挿入を推測できます。たとえば、Untracked オブジェクトを EntitySet(TEntity) に追加するか、EntityRef(TEntity) を Untracked オブジェクトに設定すると、グラフ内の追跡対象オブジェクトを介して Untracked オブジェクトに到達できるようになります。SubmitChanges の処理中に、LINQ to SQLLINQ to SQL は追跡されたオブジェクトを走査し、追跡されていない到達可能な永続オブジェクトを検出します。このようなオブジェクトは、データベースへの挿入の候補です。

質問はこれに要約されると思います-削除されたオブジェクトの状態を「追跡なし」に変更するにはどうすればよいですか?

リストからオブジェクトを削除した後、DeleteOnSubmit を試しましたが、例外が発生しました (アタッチされていないエンティティを削除できません)。

誰かが私に解決策を教えてもらえますか? ありがとう。

LINQ のみを使用してこれを達成できるかどうかを知りたいです。(ストアド プロシージャを使用して、リストにレコードのみを挿入できることはわかっています。)

4

1 に答える 1

0

List.Removeメソッドはデフォルトの等式比較子を使用して等式を決定するため、リストの要素は削除されていないと思います。

カスタム比較プログラムを作成したくない場合は、リストから削除される要素と一致する最初のパラメーターとして述語を受け取るRemoveAllメソッドを使用することをお勧めします。

list.RemoveAll( e=> /*condition to remove the element*/ );

または、指定されたインデックスに基づいて要素を削除するRemoveAtメソッド:

list.RemoveAt(0); // Delete first element
于 2009-07-31T21:06:26.720 に答える