【问题标题】:How effectively add not existing entities from input List to DB in Entity Framework如何有效地将输入列表中不存在的实体添加到实体框架中的数据库
【发布时间】:2016-12-25 13:58:59
【问题描述】:

我有一个实体User,主键属性为UCO

我想编写一个方法AddUsers,将给定列表中的所有用户添加到数据库中。问题是当管理员尝试添加一个已经存在于数据库中的用户的列表时,会引发异常。

我只添加不在数据库中的用户的解决方案在这里:

public void AddUsers(List<UserDTO> users)
{
    using (var db = new AppDbContext())
    {
        var existingUsers = Mapper.Map<List<UserDTO>>(db.Users.ToList());

        db.Users.AddRange(
                Mapper.Map<List<User>>(users
                    .Where(user => !existingUsers
                        .Select(u => u.UCO)
                        .Contains(user.UCO))));
        db.SaveChanges();
    }
}

请问有没有更有效的解决办法。如果我有 10'000 个用户,那么这将非常慢......

谢谢你的回答:)

【问题讨论】:

  • 哪个列表可能很大 - existingUsersusers 或两者兼而有之?
  • existingUsers 可能很大

标签: c# entity-framework


【解决方案1】:

如果users 列表预计不会那么大,您至少可以通过两种方式避免加载可能很大的existingUsers 列表。

首先,对users 列表中的每个项目执行一个数据库查询(所以完全是users.Count 查询):

using (var db = new AppDbContext())
{
    db.Users.AddRange(Mapper.Map<List<User>>(users
        .Where(user => !db.Users.Any(u => u.UCO == user.UCO))));
    db.SaveChanges();
}

其次,执行单个 db 查询以从数据库中存在的 users 列表中检索项目的 UCO 子集,然后将其从添加中排除:

using (var db = new AppDbContext())
{
    var userUCOs = users.Select(u => u.UCO);
    var existingUserUCOs = new HashSet<int>(db.Users
        .Where(u => userUCOs.Contains(u.UCO))
        .Select(u => u.UCO));
    db.Users.AddRange(Mapper.Map<List<User>>(users
        .Where(u => !existingUserUCOs.Contains(u.UCO))));
    db.SaveChanges();
}

(如果UCO类型不是int,则使用HashSet&lt;UCO_Type&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多