抱歉这个简单的问题。
我有一个存储过程返回一个int值,我试图将这个sp从我的asp.net linq调用到sql项目。
int currentRating = db.sproc_GetAverageByPageId(pageId);
但是我收到了这个错误:
Cannot implicitly convert type `'System.Data.Linq.ISingleResult<PsychoDataLayer.sproc_GetAverageByPageId> to 'int' .`
修改1 朋友暗示的解决方案不起作用。它一直返回0 有关更多信息,请将我的存储过程放在此处:
ALTER procedure [dbo].[sproc_GetAverageByPageId](
@PageId int )
as
select (select sum(score) from votes where pageId = @PageId)/(select count(*) from votes where pageId=@PageId)
答案 0 :(得分:8)
你应该检查the ReturnValue
property。
也许以下效果更好?
int currentRating = (int)db.sproc_GetAverageByPageId(pageId).ReturnValue;
更新:,因为您的存储过程返回结果集而不是使用return
语句,实际数据将作为db.sproc_GetAverageByPageId(pageId)
返回的可枚举中的元素提供。如果您检查the ISingleResult<T>
type,您会看到它继承IEnumerable<T>
,表示您可以枚举对象以获取数据,每个元素都是T
类型。
由于sproc执行SELECT SUM(*) ...
,我们可以指望结果集始终包含一行。因此,以下代码将为您提供集合中的第一个(也是唯一的)元素:
var sumRow = db.sproc_GetAverageByPageId(pageId).Single();
现在,sumRow
的类型将来自接口定义T
,在您的情况下为PsychoDataLayer.sproc_GetAverageByPageId
。希望这种类型包含一个包含您所追求的实际值的属性。
也许您可以与我们分享PsychoDataLayer.sproc_GetAverageByPageId
类型的布局?
答案 1 :(得分:1)
这实际上是返回ISingleResult
int currentRating = (int) db.sproc_GetAverageByPageId(pageId).ReturnValue;
将你的sp改为:
ALTER procedure [dbo].[sproc_GetAverageByPageId](
@PageId int )
as
return (select sum(score) from votes where pageId = @PageId)/(select count(*) from votes where pageId=@PageId)
答案 2 :(得分:1)
看起来你实际上是在ReturnValue之后。您可能需要将其强制转换为System.Data.Linq.ISingleResult
(如果尚未强制转换为{1}},然后将ReturnValue
强制转换为int。
答案 3 :(得分:0)
你可以做的另一件事:
ALTER procedure [dbo].[sproc_GetAverageByPageId](@PageId int ) as
select (select sum(score) from votes where pageId = @PageId)/(SELECT * FROM votes where pageId=@PageId)
WRITE&gt;&gt;
"select * From"<< instead of "select Count(*)"
select (select sum(score) from votes where pageId = @PageId)/(SELECT * FROM votes where pageId=@PageId)
之后:
int currentRating = (int)db.sproc_GetAverageByPageId(pageId).count();