实体框架:';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"

我该如何解决这个问题?

实体框架:';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();
}