【发布时间】:2011-01-20 23:06:08
【问题描述】:
我有一个不完整的用户设置表。现在我有一个小程序可以从这个表中提取设置。如何确保数据库中有该用户的记录?
我得到了这份清单
List<Guid> usersWithoutInfo
此列表包含我需要为其提取设置的用户 ID。我如何首先遍历此列表并插入丢失的记录? 我正在使用 linq 数据上下文进行所有数据处理。
【问题讨论】:
标签: c# linq linq-to-sql datacontext
我有一个不完整的用户设置表。现在我有一个小程序可以从这个表中提取设置。如何确保数据库中有该用户的记录?
我得到了这份清单
List<Guid> usersWithoutInfo
此列表包含我需要为其提取设置的用户 ID。我如何首先遍历此列表并插入丢失的记录? 我正在使用 linq 数据上下文进行所有数据处理。
【问题讨论】:
标签: c# linq linq-to-sql datacontext
应该是这样的。您必须对其进行一些调整才能编译并为您工作
List<Guid> usersWithoutInfo = new List<Guid>(){......};
var usersToInsert = usersWithoutInfo.Where(userGuid => !usertableInDB.Contains(userGuid)).ToList();
然后使用 usersToInsert 在数据库中插入用户
【讨论】:
我会使用相当于 SQL LEFT JOIN 语句的语句。下面的语句将生成用户列表,以检查与现有用户名配对的现有用户。需要插入配对名称为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();
显然,将您的表名称替换为“SettingsTable”,并将您的 Guid 字段替换为“UserGuid”。
【讨论】: