如何保存从查询中检索的数据

时间:2011-05-21 12:53:24

标签: c# sql query-optimization

我之前问了这个问题并得到了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);
       }
    }

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

除了使用安东尼奥·巴库拉(Antonio Bakula)回答的词典理念......

如果您持久保存用户词典并多次调用示例中的代码,则应考虑用户帐户是新用户,修改用户还是删除。

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

  1. 如果查询结果中的行不在字典中,则创建新用户并将其添加到字典中。
  2. 如果查询结果中的行在字典中,则更新用户信息。
  3. 如果字典项不在查询结果中,则从字典中删除用户。
  4. 我还建议不要使用SELECT *
    仅使用代码所需的表列,这可以提高代码的性能,并通过返回私有用户信息来防止潜在的安全漏洞。

答案 2 :(得分:0)

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

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);

答案 3 :(得分:0)

似乎问题的根源在数据库表中。 当你说重复的数据行时,你是说你在列表中得到重复的条目,或者你的表中有重复的数据?

提供2行重复。

两种选择: 首先,通过使用如下的distinct子句来防止从sql中提取重复数据:  选择与

不同的地方

安东尼奥提到的第二个选项是检查列表是否已经有了它。

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