不能隐式转换int?到复杂的类型

时间:2013-08-21 17:07:15

标签: c# stored-procedures ado.net complextype

我在Complex Types中创建了DemoModel.edmx,即 GetIsActive_Result 。它有一个Scalar Property,即类型为 Int32 InvitationID 。我创建了一个执行存储过程的函数。在这里我的功能。

    public GetIsActive_Result GetIsActiveUser(string email)
    {
        GetIsActive_Result result = null;

        System.Data.Objects.ObjectParameter InvitationID;
        InvitationID = new System.Data.Objects.ObjectParameter("InvitationID", -1);

        var results = this.DataContext.GetIsActiveUser(email, InvitationID);
        if (results != null)
        {
            result = results.FirstOrDefault();
        }
        return result;
    }

此功能执行存储过程,即 GetIsActiveUser

USE [Demo]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[GetIsActiveUser]
(
    @Email NCHAR(100),
    @InvitationID INT OUTPUT        
)
AS 
BEGIN
SET NOCOUNT ON;

BEGIN TRY

    IF EXISTS(select * from Users,Invitations where UserName=@Email and IsActive='Active' and Invitations.Email != @Email)
        BEGIN 
            SET @InvitationID=1
        END

    ELSE IF EXISTS(select * from Users,Invitations where UserName=@Email and IsActive='InActive' and  Invitations.Email = @Email)
        BEGIN 
            SET @InvitationID=0
        END

    SELECT @InvitationID AS InvitationID
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK
        END
    EXEC ThrowError
END CATCH
END

这是一个简单的商店程序,它返回 InvitationID 。我在第result = results.FirstOrDefault();

上收到以下错误
  

无法隐式转换类型'int?'到'DemoAppWebService.GetIsActive_Result'

如何解决此错误?我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

DataContext.GetIsActiveUser

返回一个可以为空的int。并且您正在尝试将其解析为DemoAppWebService.GetIsActive_Result,这是不允许的。您需要更改下面的方法

或者,如果您希望现有代码(略有修改)工作,则方法DataContext.GetIsActiveUser需要返回DemoAppWebService.GetIsActive_Result

public int? GetIsActiveUser(string email)
{
    System.Data.Objects.ObjectParameter InvitationID;
    InvitationID = new System.Data.Objects.ObjectParameter("InvitationID", -1);

    return this.DataContext.GetIsActiveUser(email, InvitationID);
}

答案 1 :(得分:1)

您可以使用linq

var results = this.DataContext.GetIsActiveUser(email, InvitationID)
.Cast<GetIsActive_Result>();

警告错误/或如果无法投射则返回NULL

或者您可以使用Nullable GetIsActive_Result结果构建int的对象。