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次查询.所以我的问题是,插入这些用户的效率最高的方法是什么,忽略任何重复?
你可以这样做:
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集合中过滤掉.