我之前问了这个问题并得到了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);
}
}
对于第二个表,我有自定义列表,用于保存第二个表中所有数据的条目。
返回的表是具有连接的表,并且具有相同的多行
答案 0 :(得分:1)
我不确定你为什么不在你的sql中使用distinct子句来获取唯一的结果。也会更快。你看过使用哈希表吗?
答案 1 :(得分:1)
除了使用安东尼奥·巴库拉(Antonio Bakula)回答的词典理念......
如果您持久保存用户词典并多次调用示例中的代码,则应考虑用户帐户是新用户,修改用户还是删除。
执行SQL查询时要使用的算法如下:
我还建议不要使用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中提取重复数据: 选择与
不同的地方安东尼奥提到的第二个选项是检查列表是否已经有了它。
除非有其他原因,否则建议使用第一个选项。