实体框架:';SqlParameter已包含在另一个SqlParameterCollection';中;
本文关键字:另一个 SqlParameterCollection 包含 SqlParameter 框架 实体 | 更新日期: 2023-09-27 17:58:51
我正在尝试执行以下代码。我的目标是检查是否存在具有给定电子邮件id的用户。
var result = userDbContext.users.SqlQuery("SELECT * FROM USERS WHERE @email='@emailValue'",
new SqlParameter("@email", "email"),
new SqlParameter("@emailValue","abc@mail.com"));
//new SqlParameter("p1", existingUser.password));
if (result.Count() == 0) //getting exception here
{
ViewBag.comment = "Sorry. We can not find your credentials";
return View();
}
但我在result.count()
遇到了异常,不知道出了什么问题。
例外情况是:
"SqlParameter已由另一个包含SqlParameterCollection"
我该如何解决这个问题?
您只需要在Sql查询后添加ToList()方法,并在SqlParameter:中删除@
var result = userDbContext.users.SqlQuery("SELECT * FROM USERS WHERE
@email=@emailValue",
new SqlParameter("email", "email"),
new SqlParameter("emailValue","abc@mail.com")).ToList();
//new SqlParameter("p1", existingUser.password));
if (result.Count() == 0) //getting exception here
{
ViewBag.comment = "Sorry. We can not find your credentials";
return View();
}
它会起作用的。
当您通过查询使用params时,您不能通过其他查询使用它们。在你的代码中,你使用了两次
1- userDbContext.users.SqlQuery....
2- result.Count().
但是如果你使用这个代码:
"userDbContext.users.SqlQuery(...).Count()"
您的代码将是正确的
**SqlQuery不会返回查询结果,除非您使用像any()、tolist()这样的linq扩展。。。。。另一方面,当使用SqlQuery时,结果是一个IEnumerable,当使用any()、tolist()、first()时,它被转换为结果
这样做:
SqlParameter parameter = new SqlParameter("email", SqlDbType.VarChar);
parameter.Value = "test@yahoo.com";
或者这样尝试:
var check =userDbContext.Database
.SqlQuery<user>("SELECT * FROM USERS
WHERE email=@emailValue",
new SqlParameter("@emailValue","abc@mail.com")).ToList();
SqlParameter如下所示:
var p = new SqlParameter {
ParameterName = "paramName",
DbType = DbType.Bit,
Direction = ParameterDirection.Output
};
在末尾粘贴.ToList(),并将其放在这个位置,即可执行查询。在ToList之前对原始查询的任何后续调用都会引发此错误,但如果使用ToList结果,则它将正常工作。
我遇到了同样的问题,因为我使用了运行查询的Any(),然后在没有ToList的情况下对查询运行First()。它试图再次运行查询,但它已经运行,因此已经定义了这些参数。因此,在总结中,将ToList置于末尾,并使用该结果对象,因为您不想再次执行SQL查询。
你可以试试这个
var check = (from item in userDbContext.users where item.email == email select item).FirstOrDefault();
if (check == null)
{
ViewBag.comment = "Sorry. We can not find your credentials";
return View();
}