【发布时间】: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”吗?