LINQ и уникальные идентификаторы

#c# #.net #linq #extension-methods

#c# #.net #linq #методы расширения

Вопрос:

Я написал некоторый LINQ, где я проверяю по базе данных, является ли имя пользователя уникальным, когда я добавляю нового пользователя. Мой код (см. Ниже) работает, но есть ли лучший способ сделать это? В настоящее время я полагаюсь на отслеживание ошибки, если имя пользователя не существует.

 try
        {
            var User = (from u in _database.Users
                        where u.UserID == strUserName
                        select u).First();

            if (User != null)
            {
                blnUnique = false;
            }
        }
        catch
        {
            blnUnique = false;
        }
  

Ответ №1:

Вы можете использовать перечислимые.Любой метод расширения <TSource>():

 bool isUnique = (from u in database.Users
                 where u.UserID == userName
                 select u).Any();
  

Вот альтернативный способ выразить это с помощью лямбда-выражения:

 bool isUnique = database.Users.Any(u => u.UserID == userName);
  

Обратите внимание, что оператор equals в классе String произведет сравнение порядковых номеров с учетом регистра. Если вы хотите провести сравнение без учета регистра, вам придется использовать строку.Метод Equals:

 bool isUnique = database.Users.Any(
    u => u.UserID.Equals(userName, StringComparison.OrdinalIgnoreCase));
  

Комментарии:

1. Спасибо … ‘Any’ выглядит так, как я искал, поскольку он возвращает true или false в отличие от FirstOrDefault

Ответ №2:

Используйте FirstOrDefault() вместо First()

Ответ №3:

Является ли _database репозиторием? Если это так, я бы предложил внедрить словарь внутренне, чтобы вы могли предоставить

 FindUser(userID)
  

метод, который возвращает null, если идентификатор пользователя не найден. Ваш цикл не будет хорошо масштабироваться.