Ответ 1
Попробуйте,
User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username);
Используйте SingleOrDefault
insted из Single
. Если пользователь не существует, то Single
выдаст ошибку. Пока SingleOrDefault
вернет null
, если пользователь не нашел иначе User
объект будет возвращен.
Выбор между SingleOrDefault
и FirstOrDefault
Вы можете получить объект пользователя с помощью SingleOrDefault
и FirstOrDefault
, но при выборе того, какой метод использовать, рассмотрите ниже.
- Оба возвращают только одно значение из коллекции/базы данных, если существуют другие значения по умолчанию.
- Но если у вас несколько пользователей с одинаковым именем, и вы ожидаете получить исключение при выполнении запроса LINQ, используйте
SingleOrDefault
, поскольку он будет вызывать исключение, если доступно более одного элемента. - И если вы не хотите исключение и/или вы не хотите проверять, что ваша коллекция/база данных дублирует данные, просто хотите получить первое значение из коллекции/базы данных, а затем используйте
FirstOrDefault
для лучшего сравнения производительности доSingleOrDefault
FirstOrDefault
- Обычно
FirstOrDefault
илиFirst
используется, когда нам требуется одиночное значение (сначала) из коллекции или базы данных. - В случае Fist/FirstOrDefault из базы данных извлекается только одна строка, поэтому она работает немного лучше, чем single/SingleOrDefault. такая небольшая разница едва заметна, но когда таблица содержит большое количество столбцов и строк, в это время производительность заметна.
Некоторые другие замечания
- Если
username
является первичным ключом, то я думаю, что разница между значениямиSingleOrDefault
иFirstOrDefault
не будет большой/нет, поскольку первичный ключ имеет индекс, а поиск в столбце индекса всегда будет быстрее обычного столбца. -
Single
илиSingleOrDefault
будет генерировать обычный TSQL, такой как "SELECT...". - Метод
First
илиFirstOrDefault
будет генерировать TSQL-статус, например "SELECT TOP 1..."