Хранимая процедура не распознается в LINQ to SQL как ISingleResult - PullRequest
0 голосов
/ 09 сентября 2011

Я создал хранимую процедуру, которая генерирует GUID, а затем возвращает ее как NVARCHAR, однако при попытке доступа к ней с помощью LINQ to SQL она не распознается как ISingleResult.Я создал множество других процедур, которые работали как ожидалось, например:

CREATE PROCEDURE [dbo].[GetContact]
    @ContactID [int]
AS
BEGIN

    SET NOCOUNT ON;

SELECT
    ContactID,
    PrefixTypeID,
    FirstName,
    MiddleName,
    LastName,
    Suffix,
    LanguageTypeID,
    Organization,
    OrganizationLocation,
    OrganizationDepartmentTypeID,
    OrganizationEmployeeID,
    JobTitleID,
    TimeZone,
    AccountID,
    PortalID,
    CorporateAccountID,
    ContactRelationshipTypeID,
    EthnicityID,
    CitizenshipID,
    EducationID,
    ContactSalaryRangeID,
    Age,
    Birthday,
    IsMarried,
    LeadSourceTypeID
FROM Contact
WHERE ContactID = @ContactID 

END

using (Data.Contact.ContactDataContext contactDC = new Data.Contact.ContactDataContext())
{
    Data.Contact.GetContactResult contactResult = contactDC.GetContact(this.ID).SingleOrDefault();
}

Однако, когда я пытаюсь выполнить то же самое, используя следующую процедуру, я получаю следующую ошибку Cannot implicitly convert type 'System.Data.Linq.ISingleResult <OTS.Data.Application.GetSessionResult>' to 'OTS.Data.Application.GetSessionResult'. An explicit conversion exists (are you missing a cast?)

CREATE PROCECURE [dbo].[GetSession]

AS

    DECLARE @SessionID [nvarchar](38) = NEWID()

    INSERT INTO SessionTable (SessionID) VALUES (@SessionID)

    SELECT @SessionID As SessionID

Когда я запускаю это в SSMS, он возвращает правильные данные, а в LINQ - нет.Другие вопросы, которые я нашел похожими на этот, либо остались без ответа, либо ответ был не использовать LINQ.Есть ли способ сделать это с помощью LINQ?

ОБНОВЛЕНИЕ


Код для GetSession точно такой же, как GetContact.Я попытался выполнить приведение, но получил указанную выше ошибку.

Проблема, с которой я столкнулся, похожа на эту: Вопрос о linq2sql

Однако мы попытались удалитьвоссоздание базы данных безуспешно ... не только это, но и все новые процедуры, которые создаются, теперь вызывают ту же проблему.

Использование UDF дает нужный мне вывод, однако он не работает для моего приложения.В моих процедурах я проверяю наличие записей перед возвратом данных.

пример

CREATE PROCEDURE [dbo].[GetPage]
    @PageName [nvarchar](255),
    @PagePath [nvarchar](255)
AS
BEGIN

    SET NOCOUNTON;

    DECLARE @PageID [int]

    IF NOT EXISTS(SELECT PageID FROM Page WHERE PagePath = @PagePath)
        BEGIN
            INSERT INTO Page(PageName, PagePath)
            VALUES(@PageName, @PagePath)

            SET @PageID = SCOPE_IDENTITY()
        END
    ELSE
        BEGIN
            SELECT @PageID = PageID
            FROM Page
            WHERE PagePath = @PagePath
        END

    --For the return values I have tried both ways below with the same results
    --ReQuery DB for data
    SELECT PageID, PageName, PagePath
    FROM Page
    WHERE PageID = @PageID

    --Query the Variables
    SELECT @PageID AS PageID, @PageName AS PageName, @PagePath AS PagePath

END

С невозможностью сделать INSERT или EXEC внутри UDF я не могу их использовать и мне нужно использовать SP.Любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Можете ли вы показать нам код, где вы делаете вызов метода GetSession от Линка до Скула?

Вы делаете что-то вроде

ISingleResult<GetSessionResult> result = ctx.GetSession();

Вышеуказанный вызов процедуры является правильным. Я предполагаю, что причина ошибки в том, как вы вызываете метод в L2S.

0 голосов
/ 10 сентября 2011

Надзор

Убедитесь, что вы не забыли включить using System.Data.Linq, а также ваш контекст данных.

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