1

我正在从 ActiveRecord 切换到 Dapper。我有一个包含几个字段的简单项目类:

  • 标识(整数)
  • 名称(字符串)
  • 秘密(指导)
  • OwnerId(指导)

我最初尝试使用 Dapper 导致了以下代码:我正在使用 Dapper,如下所示:

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects p WHERE p.OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

此查询导致DataException: Error parsing column 0 (Id=11 - Int16). 内部异常是InvalidCastException: Specified cast is not valid.

由于 Dapper 使用页面上的示例均未提及SELECT *,因此我尝试像这样修改我的查询:

    projects = conn.Query<Project>("SELECT OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();

当我调试时,虽然我的数据库中有两个项目,但我只得到一个;并且那个名称为 null 。

奇怪的。我究竟做错了什么?我觉得 Dapper 没有正确地将字段(DB)映射到字段(类)。我正在使用最新的 NuGet 版本。

4

2 回答 2

1

您看到的不同之处在于下一个(1.12?)版本中的关键特性。从历史上看,dapper 一直非常挑剔数据必须是完全匹配的,如果数据是 double 但字段/属性是浮点数,或者数据很长并且字段/属性是 int,它会抱怨(抛出) . 在待定版本中,有额外的代码可以检测到这一点并作为生成的 IL 的一部分进行补偿(不是通过 Convert.ChangeType - 太慢了)。

这一变化的一个关键驱动因素是一些数据库以非常不同的方式返回一些相当简单的值。对于某些数据库的用户来说,映射他们的类型通常是有问题的。

Tl;博士:我很高兴新功能对你有用。它应该很快就会发布。

于 2012-09-18T17:06:47.933 回答
0

Dapper 只会映射 SQL 的结果,因此您需要从要映射的表中选择。

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects Where OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

于 2012-09-18T09:48:32.913 回答