Не удается неявно преобразовать тип 'System.Data.Linq.ISingleResult <CustomeProcedureName>в' int ' - PullRequest
3 голосов
/ 17 октября 2010

Извините за этот простой вопрос.

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

8 голосов
/ 17 октября 2010

Вы должны проверить свойство ReturnValue .

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

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

Обновление: , поскольку ваш сохраненный процесс возвращает набор результатов вместо использования оператора return, фактические данные будут доступныкак элемент в перечислимом, возвращаемом db.sproc_GetAverageByPageId(pageId).Если вы проверите тип ISingleResult<T> , вы увидите, что он наследует IEnumerable<T>, что указывает на то, что вы можете перечислить объект для получения данных, каждый элемент имеет тип T.

Поскольку sproc делает SELECT SUM(*) ..., мы можем рассчитывать на набор результатов, который всегда будет содержать одну строку.Таким образом, следующий код даст вам первый (и единственный) элемент в коллекции:

var sumRow = db.sproc_GetAverageByPageId(pageId).Single();

Теперь тип sumRow будет T из определения интерфейса, что в вашем случаеэто PsychoDataLayer.sproc_GetAverageByPageId.Надеюсь, этот тип содержит свойство, которое содержит фактическое значение, которое вы ищете.

Возможно, вы можете поделиться с нами макетом типа PsychoDataLayer.sproc_GetAverageByPageId?

1 голос
/ 17 октября 2010

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

1 голос
/ 17 октября 2010

Это фактически возвращает 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)
0 голосов
/ 25 февраля 2015

Вы можете сделать еще одну вещь:

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

НАПИСАТЬ >>

"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();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...