从集合中删除实体

时间:2014-05-28 20:35:31

标签: c# linq

我有3张桌子;组,客户和GroupCustomers。组可以有很多客户,因此GroupCustomers表的原因。在我的C#WinForms程序中,我试图使用Linq删除特定组的所有客户。这里的代码似乎有效,但我认为我遗漏了一些东西,使这个查询更小/更容易/更快阅读&执行。

Context.Groups.Where(g => g.Id == group.Id)
                        .FirstOrDefault()
                        .Customers.ToList()
                        .ForEach(gc =>
                            {
                                Context.Groups.Where(g => g.Id == group.Id)
                                                            .FirstOrDefault()
                                                            .Customers.Remove(gc);
                            });
Context.SaveChanges();

group.Id是传递给此方法的变量。

2 个答案:

答案 0 :(得分:1)

我认为你太依赖LINQ了。我写这个:

 var group = Context.Groups.First(g => g.Id == group.Id); // if you're sure of existing
 foreach (var customer in group.Customers.ToList()) // ToList is required to avoid 'Collection was modified' exception, I think
      Context.Customers.Remove(customer);
 Context.SaveChanges();

答案 1 :(得分:0)

编写查询以选择要删除的所有项目。您希望删除特定组中的所有客户。这将对应于为连接两者而创建的GroupCustomers。选择那些,然后删除它们。

var toBeRemoved =
    from gc in Context.GroupCustomers
    where gc.GroupId == group.Id
    select gc;
foreach (var gc in toBeRemoved)
    Context.GroupCustomers.DeleteObject(gc);
Context.SaveChanges();

否则,你所拥有的在逻辑上很好,但我会做一些调整。选择要从组中删除客户的组以及从组中删除客户。 .ToList().ForEach() 永远不会用作foreach常规电话的替代。

var removeFromGroup = Context.Groups.FirstOrDefault(g => g.Id == group.Id);
foreach (var c in removeFromGroup.Customers)
    removeFromGroup.Remove(c);
Context.SaveChanges();