【问题标题】:How to save data retrieved from a query如何保存从查询中检索到的数据
【发布时间】:2011-08-30 05:24:59
【问题描述】:

我之前问过这个问题并得到了Best approach to write query 的答案,但问题是如果您必须将此结果保存在列表中,那么就会出现重复记录。例如 给定EXAMPLE的连接结果表

看到有重复的行。您如何过滤掉它们,同时保存订单号的数据? 当然可能有一些方法,但我正在寻找一些很好的方法

我们如何将数据存储在列表中而不在列表中创建重复的行?

我当前的表格代码是

  int lastUserId = 0;
  sql_cmd = new SqlCommand();
  sql_cmd.Connection = sql_con;

  sql_cmd.CommandText = "SELECT * FROM AccountsUsers LEFT JOIN Accounts ON AccountsUsers.Id = Accounts.userId ORDER BY AccountsUsers.accFirstName";
  SqlDataReader reader = sql_cmd.ExecuteReader();

  if (reader.HasRows == true)
  {
      Users userToAdd = new Users();

      while (reader.Read())
      {
           userToAdd = new Users();
           userToAdd.userId = int.Parse(reader["Id"].ToString());
           userToAdd.firstName = reader["accFirstName"].ToString();
           userToAdd.lastName = reader["accLastName"].ToString();
           lastUserId = userToAdd.userId;

           Websites domainData = new Websites();
           domainData.domainName = reader["accDomainName"].ToString();
           domainData.userName = reader["accUserName"].ToString();
           domainData.password = reader["accPass"].ToString();
           domainData.URL = reader["accDomain"].ToString();
           userToAdd.DomainData.Add(domainData);

           allUsers.Add(userToAdd);
       }
    }

对于第二个表,我有一个自定义列表,它将保存第二个表中所有数据的条目。

返回的表是有连接的表,并且有多个相同的行

【问题讨论】:

    标签: c# sql query-optimization


    【解决方案1】:

    除了使用 Antonio Bakula 回答的字典理念之外......

    如果您保留用户字典并多次调用示例中的代码,您应该认为用户帐户是新的、已修改或已删除。

    执行 SQL 查询时使用的算法如下:

    1. 如果查询结果中的行不在字典中,则创建并将新用户添加到字典中。
    2. 如果查询结果中的行在字典中,则更新用户信息。
    3. 如果字典项不在查询结果中,则从字典中删除用户。

    我还建议不要使用 SELECT *
    仅使用您的代码需要的表格列,这可以提高代码的性能,并通过返回私人用户信息来防止潜在的安全漏洞。

    【讨论】:

      【解决方案2】:

      我不确定您为什么不在 sql 中使用 distinct 子句来获取唯一结果。这也会更快。你看过使用哈希表吗?

      【讨论】:

      • 你能帮我提供样品吗?
      【解决方案3】:

      我会将用户放入字典并检查是否已经存在,如下所示:

      Dictionary<int, Users> allUsers = new Dictionary<int, Users>()
      

      然后在 Reader while 循环中:

      int userId = int.Parse(reader["Id"].ToString());
      Users currUser = allUsers[userId];
      
      if (currUser == null)
      {
        currUser = new Users();
        currUser.userId = userId);
        currUser.firstName = reader["accFirstName"].ToString();
        currUser.lastName = reader["accLastName"].ToString();
        allUsers.Add(userID, currUser);
      }
      
      Websites domainData = new Websites();
      domainData.domainName = reader["accDomainName"].ToString();
      domainData.userName = reader["accUserName"].ToString();
      domainData.password = reader["accPass"].ToString();
      domainData.URL = reader["accDomain"].ToString();
      currUser.DomainData.Add(domainData);
      

      【讨论】:

        【解决方案4】:

        似乎问题的根源在于您的数据库表。 当您说重复数据行时,您是说列表中有重复条目还是表中有重复数据?

        给出重复的 2 行。

        两个选项: 首先,通过使用以下不同的子句来防止从 sql 中提取重复数据: 选择与哪里不同

        Antonio 提到的第二个选项是检查列表是否已经包含它。

        除非有其他原因,否则建议使用第一个选项。

        【讨论】:

        • 我想查看 2 个重复的行以了解重复的位置。
        • 谢谢 ....例如左连接的结果将给出重复的行条目请参阅我标记的示例链接
        猜你喜欢
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 2014-05-21
        • 2021-01-07
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多