实体框架:'SqlParameter已被另一个SqlParameterCollection包含'

时间:2014-04-18 11:33:04

标签: c# asp.net-mvc-4

我正在尝试执行下面的代码。我的目标是检查是否存在任何具有给定电子邮件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"

我该如何解决这个问题?

5 个答案:

答案 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查询。