Я создал хранимую процедуру, которая генерирует 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.Любые идеи приветствуются.