忽略具有Entity Framework的重复键插入

Jor*_*dan 23 c# entity-framework

我正在使用ASP.NET MVC4和Entity Framework Code First.我有一个名为"users"的表,主键为"UserId".此表可能有200,000多个条目.

我需要再插入50个用户.我可能会这样做

foreach(User user in NewUsers){
    context.Add(user);
}
dbcontext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

问题是,这些新用户中的一个或多个可能已经存在于DB中.如果我添加它们然后尝试保存,则会抛出错误,并且不会添加任何有效的错误.我可以修改代码来执行此操作:

foreach(User user in NewUsers){
    if(dbcontext.Users.FirstOrDefault(u => u.UserId) == null)
    {
        dbcontext.Users.Add(user);
    }
}
dbcontext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

哪个会奏效.问题是,它必须在200,000+条目表上运行50次查询.所以我的问题是,插入这些用户的效率最高的方法是什么,忽略任何重复?

p.s*_*w.g 8

你可以这样做:

var newUserIDs = NewUsers.Select(u => u.UserId).Distinct().ToArray();
var usersInDb = dbcontext.Users.Where(u => newUserIDs.Contains(u.UserId))
                               .Select(u => u.UserId).ToArray();
var usersNotInDb = NewUsers.Where(u => !usersInDb.Contains(u.UserId));
foreach(User user in usersNotInDb){
    context.Add(user);
}

dbcontext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这将在您的数据库中执行单个查询以查找已存在的用户,然后将其从您的NewUsers集合中过滤掉.