学习使用Dapper:抛出无效的强制转换错误

时间:2014-05-08 16:02:06

标签: c# dapper

VS2013 c#windows窗体。 我正在学习Dapper,这是我的第一枪: 我有一个简单的课程:

 public class R
 {
     public int RID   { get; set; }
     public int RType { get; set; }
     public string CC { get; set; }
     public string RI { get; set; }
     .
     .
     .
}

    private void _setR(string rID)
    {            
        int r_ID = Convert.ToInt16(requestID);
        MY_R = new R();

        SqlConnection c = new SqlConnection(Connection string);
        c.Open();
        var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
                                          "from Db_View_R where RID=@r_ID", 
                                          new { @r_ID = r_ID }) ;
        c.Close();            
        MY_R = (R)v ; <--------- Invalid cast error here
    }

查询很简单:视图中的几列。只返回1行。不知道我在这里错过了什么。 提前致谢

2 个答案:

答案 0 :(得分:2)

扩展方法Query<T>返回IEnumerable<T>。因此,您绝对无法将类型IEnumerable<T>的值分配给T类型的变量。你应该只从序列中选择一个项目:

MY_R = v.FirstOrDefault(); // or First, Single, SingleOrDefault

实际上,通过改进命名,您的代码应如下所示:

var sql = "SELECT RID, RType, CC, RI FROM Db_View_R where RID = @id";

using(var conn = new SqlConnection(ConnectionString))
{
     MY_R = conn.Query<R>(sql, new { id = Convert.ToInt16(requestID) })
                .FirstOrDefault();
}

我仍然不喜欢像R这样的名字(它可能应该是Request),但它已经更加可读和安全了(你应该在using语句中包装连接用法)。

答案 1 :(得分:1)

使用SingleOrDefault()

var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
                                          "from Db_View_R where RID=@r_ID", 
                                          new { @r_ID = r_ID }).SingleOrDefault();