Вопрос про linq2sql - PullRequest
       12

Вопрос про linq2sql

0 голосов
/ 12 апреля 2011

У меня есть устаревший код с классами linq2sql. Класс DataContext имеет следующее определение для хранимой процедуры:

 [Function(Name="dbo.sp_Goods_SelectBySection")]
        public ISingleResult<sp_Goods_SelectBySectionResult> sp_Goods_SelectBySection([Parameter(Name="SectionId", DbType="Int")] System.Nullable<int> sectionId)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sectionId);
            return ((ISingleResult<sp_Goods_SelectBySectionResult>)(result.ReturnValue));
        }

Но когда я пытаюсь создать ту же процедуру в моем собственном проекте, дизайнер создает процедуру с другой реализацией:

[Function(Name="dbo.sp_Goods_SelectBySection")]
        public int sp_Goods_SelectBySection([Parameter(Name="SectionId", DbType="Int")] System.Nullable<int> sectionId)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sectionId);
            return ((int)(result.ReturnValue));
        }

И я не могу изменить тип в свойствах метода.

Вот код хранимой процедуры.

ALTER PROCEDURE [dbo].[sp_Goods_SelectBySection]
(
    @SectionId INT
)
AS
BEGIN

    SET NOCOUNT ON;

    SELECT 
        Goods.Id,
        Goods.[Name],
        TypeId,
        Makerid,
        Price,
        [Description],
        Term,
        Types.Name AS TypeName,
        Makers.Name AS MakerName,
        GoodsImage.SmallImageUrl AS MainImageUrl,
        Goods.IsDeleted,
        Goods.Rang
    FROM Goods 
         INNER JOIN Types ON (Types.Id = Goods.TypeId)
         INNER JOIN Makers ON (Makers.Id = Goods.MakerId)
         LEFT JOIN GoodsImage ON ( GoodsImage.GoodId = Goods.Id AND GoodsImage.IsMain = 1 AND GoodsImage.IsDeleted = 0 )
    WHERE 
        Types.SectionId = @SectionId
        AND Goods.IsDeleted  = 0
    ORDER BY Rang ASC       
END

Почему? А как я могу создать процедуру, которая возвращает ISingleResult вместо int?

Заметьте, у меня много таких процедур, и я думаю, что изменять каждую из них не очень хорошая идея.


Полагаю, это проблема дизайнера. Потому что я создал новый тестовый проект, и он работает нормально. Спасибо всем, кто мне помог. Особенно Андрасу Золтану.

1 Ответ

3 голосов
/ 12 апреля 2011

Извините, немного неправильно понял ваш вопрос, но я оставлю свои первоначальные комментарии

Помните, что хранимые процедуры возвращают набор результатов , а не значение;если не считать значение, возвращаемое в операторе return.Поэтому вам нужен тип, чтобы обернуть возвращаемые столбцы и строки.

Вы можете изменить тип возвращаемого значения на таблицу, если вы знаете, что SP возвращает набор строк, который отображается на один из ваших типов таблиц.Но вы не сможете просто вернуть 'int'.

См. Эту ссылку: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/1667a989-08a0-402c-9358-e4637406a75f (извините, на форумах MSDN все кончено - не SO: $) и связанная тема отhttp://msdn.microsoft.com/en-us/library/bb386975.aspx

Обновление

L2S использует эквивалент отражения SQL, чтобы выяснить, что SP возвращает для автоматической генерации результата.

Если SP не 't SELECT, или если в нем содержится только RETURN, вы получите базовый тип возврата int для вашей отображенной функции.Подобные вещи могут произойти законно или ошибочно, если SP использует операторы IF для разветвления и, соответственно, возврата различных результатов;L2S не может определить единственный тип возвращаемого значения, который может удовлетворить все возможные результаты, и поэтому он просто подходит для одного из них.

Как упоминает @JohnOpincar в своих комментариях, есть вопросительный знак о том,Вы разместили здесь на самом деле тот, который вы сопоставили - так как имена не совпадают?Я предполагаю, что вы перетащили не тот SP - и в нем есть только RETURN, или он возвращает несколько вещей, и L2S потерпел неудачу.

Update 2

Хорошо -так что вы изменили имена в источнике.Моя рекомендация состоит в том, чтобы удалить SP из конструктора L2S (и любую другую ручную попытку, которую вы можете предпринять для этого SP), и снова перетащите его обратно из проводника сервера, убедившись, что это тот же сервер / db, с которого вы его перетащили.С помощью отправленного вами SQL, L2S определенно сможет выяснить, что такое набор результатов, поскольку он очень прост.

...