1

関連する質問

すべての子テーブルを別の親テーブルに再割り当てする方法を考え出そうとしています。現在、データベースと対話するために EntityFramework 5 を使用しています。EF を使用すると必ずしも効率的であるとは限りませんが、この操作はめったに行われません。

つまり、EntityFramework を使用して親オブジェクトの基本的な変更を行うのは簡単です。

objChild.Parent = objNewParent;

SaveChanges() が呼び出されると、外部キーが適切に更新されます。

すべての関連エンティティを取得して、それらを反復処理して新しい親オブジェクトを割り当てるにはどうすればよいですか? これにはリフレクションが必要になることはわかっていますが、これまでのところ、使用可能なものをまとめることができませんでした。

私はパフォーマンスには関心がありません。データベースへの呼び出しの数、ロードされたデータの総量、メモリまたは CPU の使用は、この回答には関係ありません。それらの鍵は、どのテーブルが存在するかわからないという一般的な性質です。

基本的に、私はこれをやろうとしていますが、単一のタイプではなく、関連するすべてのレコードに対して:

var sourceParents = ParentRecords.Where(n => sourceIds.Contains(n.Id));
var targetParent =  Participants.Find(targetId);
var childRecords =  sourceParents.SelectMany(n => n.ChildRecords).ToArray();

foreach (var child in childRecords) {
    child.ParentRecord = targetParent;
}
4

1 に答える 1

2

通常、LINQ に含まれるコードの量が少ないという事実は、より効率的なソリューションを提供すると誤解される傾向があります。

現在のコードの機能:

  • ParentRecords親のリストを取得するための 1 回の反復->var sourceParents = ParentRecords.Where(n => sourceIds.Contains(n.Id));
  • sourceParents子のリストを取得するための1 回の反復->sourceParents.SelectMany(n => n.ChildRecords).ToArray();
  • childRecords各子の親を変更するための1 回の反復->foreach...

最初の 2 つの反復が同じオブジェクトを参照している限り (サブ要素は異なりますが)、コードを 2 つのループに減らすことができます。

 var targetParent = Participants.Find(targetId);
 foreach (var parent in ParentRecords)
 {
     if (parent == null) continue;
     if (sourceIds.Contains(parent.Id))
     {
         //Assigning the new parent to all the children
         foreach (var child in parent.ChildRecords)
         {
             if (child == null) continue;
             child.ParentRecord = targetParent;  
         }
     }
 }

現在の状況では、物事をより速く実行できるとは思いません (より効率的な に移行Typesする、ハードウェア リソースを最大化するアプローチに依存する、または入力データ構造を変更してより効率的な更新操作を可能にする以外に)。の行に関数がある場合は、update_the_parents_for_all_my_records()基本的に同じことを行うことに注意してください。つまり、すべての要素を反復処理します。コードサイズが小さいアプローチは、特定の条件下では問題ありませんが、コードサイズが大きいアプローチよりも適応性が低くなる傾向があります。いずれにせよ、誤解されるべきではありません。コードの長さは、実際の効率 (つまり、各ケースでコードが実際に行っていること) とは直接関係ありません。

于 2013-09-24T10:47:38.480 に答える