我正在尝试使用Dapper执行非常标准的多映射查询,并且我收到以下错误。当这似乎有效时,我偶尔会得到另一个错误,但我现在无法重现它。如果第一个问题解决了,我会将它附加到这篇文章中。
以下是查询代码:
const string storedProc = "dbo.GetStopsForRouteID";
var stops = conn.Query<RouteStop, MapLocation, RouteStop>(
storedProc, (stop, loc) =>
{
stop.Location = loc;
return stop;
}, new { RouteID = routeId }, commandType: CommandType.StoredProcedure);
在第498行的Dapper.cs中:
var deserializer2 = (Func<IDataReader, TSecond>)info.OtherDeserializers[0];
info.OtherDeserializers为null,导致NullReferenceException。
这是存储过程的内容:
SELECT
RouteStops.StopID,
RouteStops.Name,
RouteStops.Description,
RouteStops.IsInbound,
RouteStops.Location.Lat as Latitude,
RouteStops.Location.Long as Longitude
FROM dbo.Routes
INNER JOIN dbo.StopsOnRoute ON
Routes.RouteID = StopsOnRoute.RouteID
INNER JOIN dbo.RouteStops ON
StopsOnRoute.StopID = RouteStops.StopID
WHERE Routes.RouteID = @RouteID
ORDER BY StopsOnRoute.SequenceNumber
我已经仔细研究了这个短小精悍的代码,但除了TFirst的反序列化器不是null之外我找不到任何看似不合适的东西,但是TSecond是。当它创建TSecond的反序列化器并将其保留为空时会出现问题吗?
以下是类型:
public class MapLocation
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public class RouteStop {
public int StopID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsInbound { get; set; }
public MapLocation Location { get; set; }
}
答案 0 :(得分:2)
这里的主要问题可能是你没有告诉它如何“分裂”;尝试添加参数:
splitOn: "Latitude"
没有它,只要dapper可以看到没有第二个结果部分(默认情况下它会在Id
分割)。