【问题标题】:Issue with spliton using dapper.net inner join使用 dapper.net 内部连接的拆分问题
【发布时间】:2015-04-16 09:47:12
【问题描述】:

我有以下通过 dapper.net 执行的 sql 查询

  var resultList = sqlCon.Query<UserProfile, UserAddress, UserProfile>(@"

                            UPDATE [User].[User_Profile]
                                SET ProfileStatus = 4
                            WHERE Id = @UserId

                            SELECT u.Id [UserId], u.Username, u.Age,
                                   u.ProfileStatus,
                                   a.Id [AddressId], a.Country, a.[State], a.City,
                                   a.Latitude, a.Longitude
                            FROM [User].[User_Profile] u
                            INNER JOIN [User].[User_Address] a on u.id = a.UserId
                            WHERE u.Id = @UserId", (u, a) =>
                            {
                                u.Id = a.UserId;
                                return u;
                            },
                            new { UserId = userId }, splitOn: "UserId").FirstOrDefault();

运行时收到此错误:

使用多映射 API 时,如果您有除 Id“、”splitOn 以外的键,请确保设置 splitOn 参数

我的两个班如下:

首先是我试图填充的用户配置文件

 public class UserProfile
{
    public Int64 UserId { get; set; }

    public string UserName { get; set; }

    public int Age { get; set; }

    public int ProfileStatus { get; set; }

    public Int64 AddressId { get; set; }

    public int Country { get; set; }

    public int State { get; set; }

    public int City { get; set; }

    public decimal Latitude { get; set; }

    public decimal Longitude { get; set; }
}

这是我的用户地址类:

 public class UserAddress
{
    public Int64 Id { get; set; }

    public Int64 UserId { get; set; }

    public int Country { get; set; }

    public int State { get; set; }

    public int Town { get; set; }

    public string PostCode { get; set; }

    public decimal Latitude { get; set; }

    public decimal Longitude { get; set; }
}

我不确定我做错了什么,因为我认为我说过要拆分 UserId?但显然情况似乎并非如此?

** 更新**

用别名更新sql语句

                            SELECT u.Id as [UserId], u.Username as [Username], u.Age as [Age],
                                   u.ProfileStatus as [ProfileStatus], 
                                   a.Id as [AddressId], a.Country as [Country], a.[State] as [State],
                                   a.City as [City], a.Latitude as [Latitude], a.Longitude as [Longitude]
                            FROM [User].[User_Profile] u
                            INNER JOIN [User].[User_Address] a on u.id = a.UserId
                            WHERE u.Id = @UserId", (u, a) =>
                            {
                                u.UserId = a.UserId;
                                return u;
                            },
                            new { UserId = userId }, splitOn: "AddressId").FirstOrDefault();

【问题讨论】:

  • SplitOn 不正确,因为UserId 是查询中的第一列。您必须提供将第一个表/类与第二个分隔开的列。好像是AddressId,不是吗?
  • 我已经有一段时间没有和 Dapper 合作了,但你不应该改为拆分“AddressId”吗?

标签: sql dapper


【解决方案1】:

SplitOn 不正确,因为UserId 是查询中的第一列。您必须提供将第一个表/类与第二个分隔开的列,因此第一列/别名不属于表User_Profile 而是User_Address

好像是AddressId

// ...
new { UserId = userId }, splitOn: "AddressId").FirstOrDefault();

【讨论】:

  • 谢谢这似乎奏效了,问题是现在它不返回地址详细信息,当我接受该查询并在 SQL 中运行它时,我得到了正确的结果,你能看到会是什么导致问题?
  • 这也不会返回 userId,根据我的 userprofile 类运行我唯一的值是 Age、ProfileStatus 和 Username
  • @ScottAtkinson:我猜原因是你的别名。它们必须与您的属性具有相同的名称。有解决此问题的方法。 stackoverflow.com/a/9481901/284240
  • 我刚刚完成并为返回的每一列添加了一个别名,但我仍然遇到同样的问题,我已经添加了更新的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多