1

ここには、私がしたいことの非常に基本的な例があります。私が思いついたコードは非常に冗長であるようです。つまり、コレクションなどをループします。セット操作を使用して、ビューモデルのコレクションに一致するエンティティコレクション内のオブジェクトを削除するにはどうすればよいですか?

削除、挿入、更新されたViewModelのコレクションをポストバックするTelerik MVCグリッドを使用しています。ビューモデルは類似していますが、エンティティとまったく同じではありません。

たとえば:私は持っています:

注文します。 Linesは、OrderDetailレコードを含むエンティティコレクション(ナビゲーションプロパティ)です。私のコントローラの更新アクションでは、私はリストの名前DeletedLinesは、POSTデータからプルしている。私はまた、データベースを照会し、ラインコレクションを含むOrderエンティティを持っています。

ここでは、基本的には、ラインEntityCollectionのすべてのOrderDetailsを削除するように伝えたいと思います。

私はそれを行っている方法のようなものです:私は削除してDeleteObjectのにそれを渡すためにエンティティのコレクションを取得するには.Interset()を使用することができな方法があった期待していた

foreach (var line in DeletedLines) { 
    db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault()) 
} 

。しかし、DeleteObjectは、コレクションではなく単一のエンティティのみを受け入れるようです。

おそらく上記は十分です。しかし、より簡単な方法があるはずです。

おかげで、 ボブ

+0

FWIW、あなたはより多くを削除するための簡単な拡張メソッドを追加することができます一度に1つずつですが、foreachを実行するだけです:) –

答えて

2

は、コンテキストに添付DeletedLines中のアイテムはありますか?もしそうなら、これはどうですか?

foreach (var line in DeletedLines) db.DeleteObject(line); 

#1

コメントに応じて[OK]を、私は今参照してください。あなたは少し短いコードを作るではなく、多くのことができます。

foreach (var line in DeletedLines) { 
    db.DeleteObject(Order.Lines.SingleOrDefault(l => l.Key == line.Key)) 
} 

私はあなたがnullを渡したときにDeleteObjectのが例外をスローするかどうかはわかりません。データベース・クエリを再したいとのいずれかされない場合は

foreach (var line in DeletedLines) { 
    db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key)) 
} 
+0

No .. DeletedLinesはViewModelsのコレクションなので、contexにはありませんt。 – PilotBob

+0

ありがとうございます。 Lambdaを渡すのはもう少し簡潔ですが、実際にはlinq SetOperationsを使用する方法はありません。少なくとも、私はそれを伝えることができます。 – PilotBob

0

すでに持っている:それがない場合は、限り、あなたはアイテムがそこにあることを確認しているとして、シングルを使用してオフにしても良いかもしれませんマッピングテーブルのPK値は、あなたが最初に取得せずに削除するためのアレックス・ジェームズのヒントのいずれかを使用することができ、(またはクライアントコールに含めることができます):

http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

関連する問題