在Entity Framework中比较和插入/更新/删除子项

时间:2015-07-20 10:17:12

标签: c# linq

我有一个需要保存到数据库中的多选表单。用户可以在后续访问中编辑他们的选择。这些项目在具有唯一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);
    }
}

正如你所看到的那样,有多个循环和多个调用列表,这让我想知道是否有更简洁的方法来做这个?

2 个答案:

答案 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中有很多有用的功能。它包含批量更新和删除功能,它可以在您的情况下使用,它还消除了在修改实体之前检索和加载实体的需要,因此它可以在将来提高您的性能。