我有一个需要保存到数据库中的多选表单。用户可以在后续访问中编辑他们的选择。这些项目在具有唯一ID的表中定义,因此表单仅传回ID列表。
类似于:
Fruits:
{ id=1, name="apple" }
{ id=2, name="orange" }
{ id=3, name="banana" }
People:
{ id=1, name="user", fruits=apple,orange }
在DB中有一个链接表,用于链接人员ID和水果ID。
现在,当我收到编辑请求时,我需要与现有水果进行比较,以便知道是否需要添加或删除条目。
foreach (var fruit in existing_fruits)
{
if (post_fruits.Where(e => e.id == fruit.id).Count() == 0) user.Fruits.Remove(fruit);
}
foreach (var fruit in post_fruits)
{
if (existing_fruits.Where(e => e.id == fruit.id).Count() == 0)
{
var entity = context.Fruit.Where(e => e.id == fruit.id);
user.Fruits.Add(entity);
}
}
正如你所看到的那样,有多个循环和多个调用列表,这让我想知道是否有更简洁的方法来做这个?
答案 0 :(得分:2)
如果你在这里使用.Any方法怎么办(虽然它仍然使用两个循环但效率更高):
foreach (var fruit in existing_fruits)
if (!post_fruits.Any(e => e.id == fruit.id)) user.Fruits.Remove(fruit);
foreach (var fruit in post_fruits)
{
if (existing_fruits.Any(e => e.id == fruit.id)) continue;
var entity = context.FirstOrDefault(e => e.id == fruit.id);
if(entity != null) user.Fruits.Add(entity);
}
但最好将数据库架构更改为:
Fruits:
{ id=1, name="apple" }
{ id=2, name="orange" }
{ id=3, name="banana" }
People:
{ id=1, name="user" }
PeopleFruits
{ id=1, fruitId = 1, personId = 1, isSelected = 0}
现在您需要更新记录的全部内容是获取某人的PeopleFruits实体。
PeopleFruits[] personPplFruits = cont.PeopleFruits.Where(pf => pf.personId == 1).ToArray();
根据用户选择的内容更新.isSelected
属性。
请查看此文章:https://www.simple-talk.com/sql/database-administration/how-to-get-database-design-horribly-wrong/
答案 1 :(得分:2)
$substr中有很多有用的功能。它包含批量更新和删除功能,它可以在您的情况下使用,它还消除了在修改实体之前检索和加载实体的需要,因此它可以在将来提高您的性能。