我有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
是传递给此方法的变量。
答案 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();