我有一个不完整的用户设置表。现在我有一个小程序从该表中提取设置。我如何确保数据库中有该用户的记录?C#从linq列表中插入缺少的记录?
我得到这个列表
List<Guid> usersWithoutInfo
这个列表包含了我需要拉设置的用户ID。我如何首先循环访问此列表并插入缺失的记录? 我正在使用linq数据上下文进行所有数据处理。
我有一个不完整的用户设置表。现在我有一个小程序从该表中提取设置。我如何确保数据库中有该用户的记录?C#从linq列表中插入缺少的记录?
我得到这个列表
List<Guid> usersWithoutInfo
这个列表包含了我需要拉设置的用户ID。我如何首先循环访问此列表并插入缺失的记录? 我正在使用linq数据上下文进行所有数据处理。
应该是这样的。你必须调整它有点编译并为您工作
List<Guid> usersWithoutInfo = new List<Guid>(){......};
var usersToInsert = usersWithoutInfo.Where(userGuid => !usertableInDB.Contains(userGuid)).ToList();
然后使用usersToInsert插入数据库中的用户
我会使用SQL LEFT相当于JOIN语句。 Below语句将生成用户列表,以检查与现有用户名配对的现有用户。那些需要插入名称为NULL的元素需要插入:
List<string> users = new List<string> { "User1", "User3", "User5"};
List<string> usersToCheck = new List<string> { "User1", "User2", "User4", "User5" };
var leftJoin =
from userToCheck in usersToCheck
join existingUser in users
on userToCheck equals existingUser into joined
from existingUser in joined.DefaultIfEmpty()
select new
{
userToInsert = userToCheck,
user = existingUser ?? null
};
您可以在SELECT之前添加WHERE以筛选出匹配的条目。
使用一个简单的foreach循环遍历列表,然后使用Any关键字来查看该Guid是否存在任何记录。
var newSettings = new List<SettingsTableRecord>();
foreach (var userGuid in usersWithoutInfo) {
if(!context.SettingsTableRecords.Any(u=>u.UserGuid.Equals(userGuid)){
//do work to crate records, such as
newSettings.Add(new SettingsTableRecord {UserGuid = userGuid, Email="Hi!"});
}
}
//insert the new records
context.SettingsTableRecords.InsertAllOnSubmit(newSettings);
context.SubmitChanges();
显然,将“表格名称”替换为“UserGuid”的Guid字段。