Dapper.NET multi mapping TSecond Deserializer является нулевым - PullRequest
4 голосов
/ 05 октября 2011

Я пытаюсь выполнить очень стандартный запрос многократного отображения, используя 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.OtherDeserializer имеет значение 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; }
}

1 Ответ

2 голосов
/ 05 октября 2011

Вероятно, главная проблема здесь в том, что вы не сказали ему, как "разбить"; попробуйте добавить параметр:

splitOn: "Latitude"

без этого, насколько может видеть дэппер нет второй порции результата (по умолчанию она разбивается на Id).

...