4

我正在尝试使用 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);

在 Dapper.cs 第 498 行:

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 的反序列化器不为空,但 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; }
}
4

1 回答 1

2

可能这里的主要问题是您没有告诉它如何“拆分”;尝试添加参数:

splitOn: "Latitude"

没有它,就 dapper 可以看到没有第二个结果部分(默认情况下它会拆分Id)。

于 2011-10-05T05:41:03.667 回答