Метод расширения LINQ бросает ошибку при вводе комбинации электронной почты и пароля, которая не существует в моей базе данных.
Ошибка: System.InvalidOperationException {"Последовательность не содержит элементов"}
Вот мой код
[HttpPost]
public ActionResult Login(UserLogin userlogin)
{
ViewBag.LoginError = "";
if (ModelState.IsValid)
{
//no validation errors
//userContext.Users gives a list with all users on databse
//here is my linq query to select the user with valid email and password combination
User loggedInUser = (from user in userContext.Users
where user.EmailId == userlogin.UserEmail & user.Password == userlogin.UserPassword
select user).First();//Error Source
if (loggedInUser != null)
{
ViewBag.ValidUser = loggedInUser;
return RedirectToAction("UserHomePage", "UserHome");
}
else
{
ViewBag.LoginError = "Invalid User name and Password Combination";
return View("Index");
}
}
return View("Index");
}
и считает
Вы захотите использовать FirstOrDefault()
а не First
- это вернет null
если элементы не найдены. Обычно вы также должны использовать оператор короткого замыкания &&
(not &
), если вы не намеренно хотите, чтобы оба выражения были оценены.
Если нет пользователя с указанной комбинацией паролей имени пользователя, тогда запрос:
from user in userContext.Users
where user.EmailId == userlogin.UserEmail & user.Password == userlogin.UserPassword
select user
не приведет к отсутствию объектов, и вызов First()
на нем выкинет это исключение.
Вы считали, FirstOrDefault()
вместо использования FirstOrDefault()
: если нет объектов, то он будет возвращать значение null (при условии, что user
является ссылочным типом).