我正在尝试使用一种登录表单进行管理员和用户登录。但我一直收到错误消息“序列不包含任何元素”。我使用了下面的代码。
[HttpPost]
public ActionResult Login(CustomerAccount user, Admin admnLogin)
{
using (ProjDbContext db = new ProjDbContext())
{
var usr = db.CustomerAccounts.Single(u => u.Email == user.Email && u.Password == user.Password);
var admn = db.CustomerAccounts.Single(u => u.Email == admnLogin.Email && u.Password == admnLogin.Password);
if (usr != null)
{
Session["CustId"] = db.CustomerAccounts.Single(x => x.Email == user.Email).CustId;
Session["Email"] = usr.Email.ToString();
return RedirectToAction("TicketForm");
}
else if (admn != null)
{
Session["AdminId"] = db.Admins.Single(x => x.Email == admnLogin.Email).AdminID;
Session["Email"] = usr.Email.ToString();
return RedirectToAction("AdminPanel");
}
else
{
ModelState.AddModelError("", "Email or Password is wrong.");
}
}
return View();
}
任何人都可以帮助我解决这个问题吗?
答案 0 :(得分:1)
我认为它与LINQ有关,通常会看到此错误,因为您使用的是First()或Single()命令,而不是FirstOrDefault()和SingleOrDefault()。
示例:
Session [“ CustId”] = db.CustomerAccounts.SingleOrDefault(x => x.Email == user.Email).CustId;
Session [“ AdminId”] = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email).AdminID;
答案 1 :(得分:0)
根据Fixing LINQ Error: Sequence contains no elements,使用包含空数据的First()
或Single()
时会发生此异常。解决此异常的常用方法是使用FirstOrDefault()
,SingleOrDefault()
或DefaultIfEmpty()
,但请注意,使用FirstOrDefault()
或SingleOrDefault()
时引用对象包含空值并且应该在访问其中的任何成员之前进行检查。
因此,应像下面的示例一样检查空值对会话变量的分配:
// Customers
var cust = db.CustomerAccounts.Single(x => x.Email == user.Email);
if (cust != null)
{
Session["CustId"] = cust.CustId;
}
// Admins
var admin = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email);
if (admin != null)
{
Session["AdminId"] = admin.AdminID;
}
对于C#6及更高版本,在SingleOrDefault()
之后访问属性成员时,可以使用null-conditional operator:
// Customers
Session["CustId"] = db.CustomerAccounts.SingleOrDefault(x => x.Email == user.Email)?.CustId;
// Admins
Session["AdminId"] = db.Admins.SingleOrDefault(x => x.Email == admnLogin.Email)?.AdminID;