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以获取父母列表-> var sourceParents = ParentRecords.Where(n => sourceIds.Contains(n.Id));
  • 一次迭代sourceParents以获取子列表->sourceParents.SelectMany(n => n.ChildRecords).ToArray();
  • 通过一次迭代childRecords来更改每个孩子的父母 ->foreach...

就前两次迭代引用相同的对象(尽管指向不同的子元素)而言,您的代码可以简化为两个循环:

 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 回答