为什么我的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
!!有什么问题吗?
你没有正确传递参数:
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, ...)
来绑定它。