我应该在这里使用什么而不是ExecuteScalar?

use*_*283 2 c# sql t-sql asp.net asp.net-mvc

我试图返回DbSet<Survey>这里Survey被定义为

public class Survey
{
    public int Id { get; set; }
    [StringLength(100)]
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

An exception of type 'System.InvalidCastException' occurred in Survey.dll but was not handled in user code

Additional information: Unable to cast object of type 'System.Int32' to type 'System.Data.Entity.DbSet`1[Survey.Models.Survey]'.
Run Code Online (Sandbox Code Playgroud)

关于DbSet<Survey> AllSurveys = (DbSet<Survey>)cmd.ExecuteScalar();线

    public DbSet<Survey> GetAllSurveys ( )
    {
        SqlCommand cmd = new SqlCommand("GetAllSurveys", this._Conn);
        cmd.CommandType = CommandType.StoredProcedure;
        this._Conn.Open();
        DbSet<Survey> AllSurveys = (DbSet<Survey>)cmd.ExecuteScalar();
        this._Conn.Close();
        return AllSurveys;
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用数据库中的表和我正在使用的sproc

CREATE TABLE Surveys (
    id INT IDENTITY(1,1),
    title NVARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);
GO
-- Create sprocs for adding, deleting, getting surveys
CREATE PROCEDURE AddSurvey
    @title NVARCHAR(100)
AS
    INSERT INTO Surveys (title) VALUES (@title)
GO
CREATE PROCEDURE DeleteSurvey
    @id INT
AS
    DELETE FROM Surveys WHERE id=@id
GO
-- Seed the surveys table with 1 sample survey
EXEC AddSurvey @title = "Survey Numero Uno";

GO
CREATE PROCEDURE GetAllSurveys
AS
    SELECT * FROM SURVEYS 
        ORDER BY title ASC;
GO
Run Code Online (Sandbox Code Playgroud)

知道我哪里错了吗?

Zip*_*ppy 5

这一行将 DbSet<Survey> AllSurveys = (DbSet<Survey>)cmd.ExecuteScalar();返回一个int.您可以尝试以下方式:

编辑基于您对旧学校.NET的评论.您的方法还有一件事可以改变.

您的完整方法可能如下所示:

  public DbSet<Survey> GetAllSurveys ( )
    {
        using (SqlCommand cmd = new SqlCommand("GetAllSurveys", this._Conn)
        {
           cmd.CommandType = CommandType.StoredProcedure;
           this._Conn.Open();
           DbSet<Survey> AllSurveys = new DbSet<Survey>();
           using (SqlDataReader dataReader = cmd.ExecuteReader())
                        {
                            while (dataReader.Read())
                            {
                                Survey srv=new Survey {
                                  Id = dataReader.IsDBNull(0)?Default(int): dataReader.GetInt32(0),
                                  Title =dataReader.IsDBNull(1)?String.Empty: dataReader.GetString(1)};
                                AllSurveys.Add(srv);
                            }
                        }
           this._Conn.Close();
           return AllSurveys;
    }
}
Run Code Online (Sandbox Code Playgroud)