列表<用户> </用户>中已存在检查或昵称

时间:2013-07-17 17:38:59

标签: c# asp.net list

我正在创建一个可以注册的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&lt;&gt;检查用户名的错误方法。在我看来。我认为这个用户名检查必须以另一种方式完成。

你能帮我专家吗?我也可以使用SQL查询进行此检查,但我想在c#中执行此操作。

8 个答案:

答案 0 :(得分:6)

不是从DB返回所有用户,而是将用户名传递给Query /存储过程,让后端进行检查,然后返回状态标志1/0 - 存在/不存在。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

您可以在tocheck

中使用Contains operator
listExistingUsers.Select(x => x.Nickname).Contains(txtNickname.text);

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

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

答案 3 :(得分:1)

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

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

BTW如果您将GetUsers更改为返回IQueryable<User>,则会在服务器端进行检查。

答案 4 :(得分:1)

获取一次NickNames列表

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.";
}

答案 5 :(得分:0)

1)您是否确认Database.GetUsers()实际上正在返回完整列表,没有SQL问题?

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

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

if (listExistingUsers.Any(u => string.Equals(u, txtNickname.Text, StringComparison.CurrentCultureIgnoreCase)))
{
   // Process error
}

答案 6 :(得分: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. 
 }

答案 7 :(得分:0)

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

特别地:

  • 切断尾随和结尾空格
  • 确定用户名是否应该敏感
  • 确保在创建新用户名时,您还没有

关于加载用户并检查:

如上所述,LINQ是最有效的C#,例如检查重复项 (if(Database.GetUsers()。选择(x =&gt; x.Nickname).Contains(txtNickname.Text)))

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