为什么我的SQL查询不工作的实体框架

本文关键字:实体 框架 工作 我的 SQL 查询 为什么 | 更新日期: 2023-09-27 18:11:58

我使用他的代码在实体框架中执行SQL query:

using (var db = new VSServicesEntities())
            {                 
                const string selectCmd = @"if exists (Select top 1 IsUserOn From ServiceMembers Where ServiceCode={0} and Number={1}) 
                             Select isnull(IsUserOn,0) IsUserOn
                             From ServiceMembers Where ServiceCode={0} and Number={1}
                          else 
                             Select Null IsUserOn";
                 var data = db.ServiceMembers.SqlQuery(selectCmd, "A", 091242535970).ToList();
                if (data.Any())
                {
                   var serviceMember = data.First().IsUserOn;
                if (serviceMember.ToString() == "")
                    label1.Text = "";
                else
                    label1.Text = (serviceMember.ToString() == "True" ? "On" : "Off");
                }
    }

但是它给了我一个异常:

必须声明标量变量"@ServiceCode"

但我给价值ServiceCode= A,问题是什么?

编辑2:我在上面编辑了我的查询,但现在它给了我另一个例外:

数据读取器与指定的'VSServicesModel.ServiceMember'不兼容。类型'ServiceCode'的成员在数据读取器中没有相同名称的对应列

但是我的列名是:ServiceCode !!有什么问题吗?

为什么我的SQL查询不工作的实体框架

你没有正确传递参数:

var data = db.ServiceMembers.SqlQuery(selectCmd, 
    new SqlParameter("@ServiceCode", "A"), 
    new SqlParameter("@Number", 091242535970)).ToList();

编辑

EF将尝试赋值给data的类型是ServiceMembers元素的类型(假设是ServiceMember)。您返回的唯一字段是IsON,它与您引用的属性IsUserOn不匹配。试试相反:

Select isnull(IsUserOn,0) AS IsUserON
...
Select Null AS IsUserON

请注意,除非您从具有匹配名称的查询中返回其他属性,否则不会填充它们。

编辑你已经改变了你的sql查询-绑定与ServiceCode=@ServiceCode and Number=@Number正常工作。据猜测,Reader抱怨的原因是因为您只返回一个列(IsUserON)并试图将其绑定到完整的ServiceMember类。要么返回所有列(特别是主键,假设是ServiceCode),要么创建一个仅具有属性IsUserON的新类,然后使用泛型重载db.SqlQuery<MyNewPoco>(cmd, ...)来绑定它。