我正在尝试执行下面的代码。我的目标是检查是否存在任何具有给定电子邮件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"
我该如何解决这个问题?
答案 0 :(得分:2)
做这样的事情:
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
};
答案 1 :(得分:2)
您只需要在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();
}
它将起作用。
答案 2 :(得分:1)
当您通过查询使用params时,您无法通过其他查询使用params。在您的代码中,您正在使用它们两次
1- userDbContext.users.SqlQuery....
2- result.Count().
但如果您使用此代码:
"userDbContext.users.SqlQuery(...).Count()"
您的代码将是正确的
** SqlQuery不会返回查询结果,直到您使用linq扩展名(如any(),tolist().....)另一方面,当您使用SqlQuery时,结果是IEnumerable,当您使用任何( ),tolist(),first()它转换为结果
答案 3 :(得分:0)
你可以试试这个
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();
}
答案 4 :(得分:0)
最后敲击.ToList()并恰好在此位置执行查询。 ToList之前对原始查询的任何后续调用都将引发此错误,但是,如果使用ToList结果,它将正常工作。
我遇到了同样的问题,因为我使用了Any()来运行查询,然后对没有ToList的查询运行First()之后。它尝试再次运行查询,但是它已经运行,因此已经定义了那些参数。因此,最后总结一下,将ToList拍一下,并使用该结果对象,因为您不想再次执行SQL查询。