2010-10-17 2 views
2

Извините за этот простой вопрос.Невозможно неявно преобразовать тип 'System.Data.Linq.ISingleResult <CustomeProcedureName> в' int '

У меня есть хранимая процедура, возвращающая значение 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' .` 

Edit 1 решение, друзья подразумевал не работали. Все время возвращать 0 Для получения дополнительной информации я кладу хранимую процедуру здесь:

ALTER procedure [dbo].[sproc_GetAverageByPageId](
@PageId int) 
as 
select (select sum(score) from votes where pageId = @PageId)/(select count(*) from votes where [email protected]) 
+0

Фактический результат обернута внутри ISingleResult. – bzlm

+0

Будут три идентичных ответа в пространстве 1 мин. Надеюсь, они сработают! – cofiem

+0

@cofiem - действительно. Надеюсь, @Mostafa просветит нас результатами :) –

ответ

7

You следует проверить the ReturnValue property.

Возможно, следующее работает лучше?

int currentRating = (int)db.sproc_GetAverageByPageId(pageId).ReturnValue; 

Update: поскольку хранимая процедура возвращает набор результатов, вместо того, чтобы использовать 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?

+0

Но он возвращает 0 все время, пока он отлично работает в хранимой процедуре – Mostafa

+0

@Mostafa - как вы вернете значение в своем sproc? –

+0

ALTER procedure [dbo] . [sproc_GetAverageByPageId] ( @PageId int) как выберите (выберите сумму голосов, где pageId = @PageId)/(выберите count (*) из голосов, где pageId = @ PageId) – Mostafa

1

Это фактически возвращая ISingleResult

int currentRating = (int) db.sproc_GetAverageByPageId(pageId).ReturnValue; 

Изменение зр на:

ALTER procedure [dbo].[sproc_GetAverageByPageId](
@PageId int) 
as 
    return (select sum(score) from votes where pageId = @PageId)/(select count(*) from votes where [email protected]) 
+0

А, прямо сейчас, я понял, что вы уже ответили мне правильно. Я не видел ваш пост после редактирования. Извините за то, что вы не выбрали свой пост как принятый ответ. :( – Mostafa

+0

lol. C'est la vie ..... –

1

Похоже, вы на самом деле после ReturnValue. Вам может потребоваться отдать его System.Data.Linq.ISingleResult, если он еще не был, а затем нарисовать ReturnValue в int.более

0

одна вещь, которую вы можете сделать:

ALTER procedure [dbo].[sproc_GetAverageByPageId](@PageId int) as 
    select (select sum(score) from votes where pageId = @PageId)/(SELECT * FROM votes where [email protected]) 

WRITE >>

"select * From"<< instead of "select Count(*)" 
select (select sum(score) from votes where pageId = @PageId)/(SELECT * FROM votes where [email protected]) 

и после этого:

int currentRating = (int)db.sproc_GetAverageByPageId(pageId).count();

Смежные вопросы