无法将类型'System.Data.Linq.ISingleResult <customeprocedurename>隐式转换为'int'</customeprocedurename>

时间:2010-10-17 09:49:05

标签: asp.net linq linq-to-sql types

抱歉这个简单的问题。

我有一个存储过程返回一个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)

4 个答案:

答案 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();