数据读取器与指定的“ StoredProcedureReturn”不兼容

时间:2019-02-06 06:30:34

标签: c# sql sql-server entity-framework stored-procedures

我编写了一个存储过程,在其中使JOIN并从两个表中获取数据。

我从存储过程中的JOIN中获取了Invigilator名称以及城市名称,但是在Entity Framework存储过程中未运行,并且下面的异常即将到来

  

消息“数据读取器与指定的读取器不兼容   'pts_dbnModel.GetInviglatorData_Result'。该类型的成员,   “ Name1”在数据读取器中没有对应的列   相同的名称。“字符串

select s.Name,s.contact ,c.Name ,s.frequency,s.cnic from zaid.invigilator s
INNER JOIN zaid.city c ON s.city=c.ID
INNER JOIN CompaignInvigilatorMapping m ON s.ID=m.InvigilatorId
INNER JOIN [hasnat.compaign] h ON m.CompaignId=h.ID where 
h.CompaignName=@CompName

现在问题出在Name字段上。因为s.Name来自Invigilator表,而c.Name来自城市表。

2 个答案:

答案 0 :(得分:1)

使用别名

select s.Name as invaigilatorName,s.contact ,c.Name as cityName ,s.frequency,s.cnic from zaid.invigilator s
INNER JOIN zaid.city c ON s.city=c.ID
INNER JOIN CompaignInvigilatorMapping m ON s.ID=m.InvigilatorId
INNER JOIN [hasnat.compaign] h ON m.CompaignId=h.ID where 
h.CompaignName=@CompName

答案 1 :(得分:1)

您有两个具有相同列名的表,因此您的选择查询不会像以前那样出现问题,如果您不限定列名(例如s.Name,c.Name),则会得到异常

  

列名“名称”不明确。

但是您的问题与EF有关,该错误消息表示您的存储过程的结果不包含名为Name1的列,您有两种选择来解决此问题。

1-在您的存储过程中以别名(例如:

)显示Name1
select s.Name as Name1,s.contact ,c.Name ,s.frequency,s.cnic from zaid.invigilator s
INNER JOIN zaid.city c ON s.city=c.ID
INNER JOIN CompaignInvigilatorMapping m ON s.ID=m.InvigilatorId
INNER JOIN [hasnat.compaign] h ON m.CompaignId=h.ID where 
h.CompaignName=@CompName

2-或使您的EF模型和查询与存储过程的输出兼容(例如,将Name1模型中的Name重命名为EF)。

您的存储过程本身并没有问题,但是它应该与您的EF模型兼容,反之亦然。