我正在创建一个可以注册的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#中执行此操作。
答案 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
备注:您可以使用Any
或count
(非常昂贵的最后解决方案)
答案 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语句是否将所有用户拉入内存池或只是具有相同昵称的用户。