2

我正在创建一个可以注册的 ASP 网站。

访问者选择注册的昵称必须是唯一的。

每次用户注册时,我都会从数据库中选择所有用户,然后我使用 foreach 循环来检查用户名是否已经存在:

private List<User> listExistingUsers;
listExistingUsers = Database.GetUsers();
foreach (User u in listExistingUsers)
{
    if (u.Nickname == txtNickname.text)
    {
        Error = "Username already in use.";
    }
}

但是上面的代码不能正常工作。它不会检查从数据库中读取的列表中的所有项目。因此,可能会有用户具有相同的用户名,这是我不想要的。

我能做些什么来解决这个问题?我阅读了有关 LINQ 的信息,但我认为这是使用 List<> 检查用户名的错误方法。我认为这个用户名检查必须以另一种方式完成。

各位高手能帮帮我吗?我也可以用 SQL 查询来做这个检查,但我想用 c# 来做。

4

8 回答 8

6

不要从数据库返回所有用户,而是将用户名传递给查询/存储过程并让后端进行检查,然后只返回一个状态标志 1/0 - 存在/不存在。

于 2013-07-17T17:43:14.407 回答
4

if (Database.GetUsers().Select(x => x.Nickname).Contains(txtNickname.Text))应该做你想做的。

我已将所有内容浓缩为一行,因此我将快速解释一下;首先,我使用您的Database.GetUsers()方法来检索用户,然后我使用 select 来投影昵称,因为这就是我们正在比较的内容。如果它自己执行,它将导致IEnumerable<string>所有昵称。从那里我使用 contains 查看该列表是否包含(我假设)已在 UI 中输入的昵称。

于 2013-07-17T17:41:55.033 回答
1

您可以使用Contains operator以检查

listExistingUsers.Select(x => x.Nickname).Contains(txtNickname.text);

链接:http: //msdn.microsoft.com/fr-fr/library/bhkz42b3%28v=vs.80%29.aspx

备注:您可以使用Anycount(非常昂贵的最后一个解决方案)

于 2013-07-17T17:41:09.843 回答
1

获取一次昵称列表

var nickNames = new List<string>();

for(int i=0;i<listExistingUsers.Count;i++)
{
     nickNames.Add(listExistingUsers.NickName);
}

然后你可以简单地使用

if(nickNames.Contains(txtNickname.text))
{
     Error = "Username already in use.";
}
于 2013-07-17T17:43:09.373 回答
1

使用任何运算符。它检查序列的任何元素是否满足某些条件。在您的情况下,用户昵称等于 textBox 中的文本

if (Database.GetUsers().Any(u => u.Nickname == txtNickname.Text))
    Error = "Username already in use.";

顺便说一句,如果您更改GetUsers为返回IQueryable<User>,则将在服务器端进行检查。

于 2013-07-17T17:42:58.617 回答
0

我认为您的任务中最棘手的部分是正确填充数据库。

特别:

  • 切断尾随和结束空格
  • 确定用户名是否应区分大小写
  • 确保在创建新用户名时您还没有昵称

关于加载用户和检查:

如上所述,LINQ 是最有效的 C#,例如检查重复项( if (Database.GetUsers().Select(x => x.Nickname).Contains(txtNickname.Text)))

我更习惯于编写 SQL 语句而不是使用 LINQ。如果您有很多用户,SQL 将只读取选定的用户,但我不知道上面的 LINQ 语句是将所有用户拉入内存池还是仅将具有相同昵称的用户拉入内存池。

于 2013-07-17T18:09:46.797 回答
0

如果 Database.GetUsers() 返回数据库中的所有用户,请不要使用它!想象一下,如果您已经有 1000 个用户,对于每个新用户,它将加载所有用户,并且您将遇到性能问题。

相反,创建一个搜索数据库并仅返回一个结果的新方法,以防它存在。就像是 :

private bool Database.UserExists(txtNickname.text) {
      //Your query to database with a where statment looking for the nickname. It could be a LINQ query, or any other way you use in your system.
      //If it brings 1 result, it has to return true. 
 }
于 2013-07-17T18:00:32.050 回答
0

1) 您是否验证过 Database.GetUsers() 实际上返回的是完整列表,没有 SQL 问题?

2)你需要它不区分大小写吗?

3)您可以使用 LINQ 执行如下查询:

if (listExistingUsers.Any(u => string.Equals(u, txtNickname.Text, StringComparison.CurrentCultureIgnoreCase)))
{
   // Process error
}
于 2013-07-17T17:44:35.530 回答