存储过程在LINQ to SQL中不被识别为ISingleResult

时间:2011-09-09 02:55:52

标签: linq stored-procedures c#-4.0

我创建了一个生成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完全相同。我已经尝试过它,但收到上面列出的错误。

我遇到的问题与此类似:Question about linq2sql

但是我们尝试删除并重新创建dbml但没有成功......不仅如此,创建的所有新过程现在都产生了同样的问题。

使用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

由于无法在UDF内部执行INSERTEXEC,我无法使用它们并需要使用SP。任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

您能告诉我们从Linq到Sql调用GetSession方法的代码吗?

你在做什么

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

以上对程序的调用是正确的。我想错误的原因来自你在L2S中调用方法的方式。

答案 1 :(得分:0)

<强>监督

确保您不要忘记包含using System.Data.Linq以及您的数据背景。