2013-07-17 2 views
2

Я создаю веб-сайт ASP с возможностью регистрации.Проверка или псевдоним уже существует в списке <User>

Прозвище, которое посетители выбирают для регистрации, должно быть уникальным.

Everytime когда пользователь регистрируется, я выбираю все пользователь из базы данных, а затем я использую цикл Еогеаспа для проверки или имя пользователя уже существует:

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

Но приведенный выше код не работает должным образом. Он не проверяет все элементы в списке, которые считываются из базы данных. Таким образом, возможно иметь пользователей с теми же именами пользователей, которых я не хочу.

Что делать, чтобы решить эту проблему? Я читал о LINQ, но считаю, что это неверный способ проверить имена пользователей со списком <> по-моему. Я думаю, что это имя пользователя-проверки должно быть выполнено по-другому.

Вы можете мне помочь? Я также мог бы выполнить эту проверку с помощью SQL-запроса, но я хотел бы сделать это в C#.

+0

Что значит, что он не проверяет все элементы в списке, которые читаются из базы данных? Какая линия выходит из цикла foreach? вы уверены, что 'listExistingUsers' содержит всех пользователей? – Tim

+0

просто мысль, но это может быть проблема. попробуйте 'if (u.Nickname.ToLower() == txtNickname.text.ToLower())' перед тем, как перейти к решениям. – user1

ответ

6

Вместо возврата всех пользователей из БД, передать имя пользователя для запроса/хранимой процедуры, и пусть бэкенд сделать проверьте, а затем верните только флаг состояния 1/0 - существует/нет.

+0

Вы имеете в виду, что нужно сделать что-то вроде этого ?: публичный список CheckUsername (строка имя пользователя) { string sql = "SELECT Username FROM User WHERE Имя пользователя = @username" } – Swag

+0

и если этот список возвращает .Count> 1, то имя пользователя существует? – Swag

+0

@xVizzi это один из способов сделать это. Вам даже не нужно выбирать имя пользователя и проверять количество, просто «SELECT 1» и проверить результат для DbNull –

1

Вы можете использовать Contains operator в порядке tocheck

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

ссылка: http://msdn.microsoft.com/fr-fr/library/bhkz42b3%28v=vs.80%29.aspx

Примечание: Вы можете использовать Any или count (очень дорого последнее решение)

4

if (Database.GetUsers().Select(x => x.Nickname).Contains(txtNickname.Text)) должны делать то, что вы хотите.

Я сгустил все в одну строку, поэтому дам краткое объяснение; Сначала я использую ваш метод Database.GetUsers() для извлечения пользователей, затем я использую select для проецирования Nickname, поскольку это то, что мы сравниваем. Если бы это было выполнено самостоятельно, это привело бы к IEnumerable<string> со всеми прозвищами. Оттуда я использую contains, чтобы увидеть, содержит ли этот список псевдоним, который (я предполагаю) был введен в пользовательский интерфейс.

+0

Спасибо. Это лучший способ сделать это, чтобы вы считали? – Swag

+0

@xVizzi в C# код, есть. Если вам действительно не нужны пользователи, вам, вероятно, лучше всего делать проверку в SQL. Кроме того, я, если вы собираетесь использовать пользователей в другом месте, вы должны назначить возвращаемое значение 'Database.GetUsers()' для локального var в строке выше этого, поэтому вам не нужно повторять этот запрос. – evanmcdonnal

1

Использование Any Оператор. Он проверяет, удовлетворяет ли какой-либо элемент последовательности некоторому условию. В вашем случае условие является пользователь ник составляет текст в TextBox:

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

BTW, если вы измените GetUsers вернуть IQueryable<User> затем проверить будет происходить на стороне сервера.

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

listExistingUsers это список пользователей, вы должны выберите имя пользователя –

+0

Спасибо @AghilasYakoub для коррекции – Sami

+0

я рад помочь вам САМИ, я добавить точку –

0

1) Вы подтвердили, что Database.GetUsers() фактически возвращает полный список без проблем SQL?

2) Вам нужно, чтобы это было нечувствительным к регистру?

3) Вы можете использовать LINQ, чтобы сделать запрос, как это:

if (listExistingUsers.Any(u => string.Equals(u, txtNickname.Text, StringComparison.CurrentCultureIgnoreCase))) 
{ 
    // Process error 
} 
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. 
} 
0

Я думаю, что самая сложная часть вашей задачи, чтобы заполнить базу данных правильно.

В частности:

  • Отрезать отставая и заканчивая пространства
  • Решите, если имена пользователей должны Becase чувствительны
  • Убедитесь, что при создании нового имени пользователя не имеет ника уже

О Загрузка пользователей и проверки:

Как уже упоминалось выше LINQ является наиболее эффективным С # как проверка дубликатов (если (Database.GetUsers(). Выберите (х => x.Nickname) .Contains (txtNickname.Text)))

Я Я больше привык писать записи SQL, чем использовать LINQ. Если у вас много пользователей, SQL будет читать только выбранные, но я не знаю, будет ли приведенный выше оператор LINQ вытаскивать всех пользователей в пул памяти или только с одним и тем же псевдонимом.

Смежные вопросы