【问题标题】:Stored Procedure not being recognized in LINQ to SQL as a ISingleResult存储过程在 LINQ to SQL 中未被识别为 ISingleResult
【发布时间】:2011-09-10 04:30:04
【问题描述】:

我创建了一个存储过程,它生成 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。任何想法都表示赞赏。

【问题讨论】:

    标签: linq stored-procedures c#-4.0


    【解决方案1】:

    您能否向我们展示您从 Linq 到 Sql 调用 GetSession 方法的代码?

    你在做类似的事情

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

    上面对过程的调用是正确的。我想错误的原因是你在 L2S 中调用方法的方式。

    【讨论】:

      【解决方案2】:

      监督

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 2010-10-04
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多