【问题标题】:C# Insert missing records, from a list with linq?C# 从带有 linq 的列表中插入丢失的记录?
【发布时间】:2011-01-20 23:06:08
【问题描述】:

我有一个不完整的用户设置表。现在我有一个小程序可以从这个表中提取设置。如何确保数据库中有该用户的记录?

我得到了这份清单

List<Guid> usersWithoutInfo

此列表包含我需要为其提取设置的用户 ID。我如何首先遍历此列表并插入丢失的记录? 我正在使用 linq 数据上下文进行所有数据处理。

【问题讨论】:

    标签: c# linq linq-to-sql datacontext


    【解决方案1】:

    应该是这样的。您必须对其进行一些调整才能编译并为您工作

    List<Guid> usersWithoutInfo = new List<Guid>(){......};
    
    var usersToInsert = usersWithoutInfo.Where(userGuid => !usertableInDB.Contains(userGuid)).ToList();
    

    然后使用 usersToInsert 在数据库中插入用户

    【讨论】:

      【解决方案2】:

      我会使用相当于 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 以过滤掉匹配的条目。

      【讨论】:

        【解决方案3】:

        使用简单的 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”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多