开发者

Dapper.NET multi mapping TSecond Deserializer is null

开发者 https://www.devze.com 2023-04-11 08:06 出处:网络
I\'m trying to perform a very standard multi mapping query using Dapper, and I\'m getting the following error. I also get another error occasionally when this seems to work, but I\'m unable to reprodu

I'm trying to perform a very standard multi mapping query using Dapper, and I'm getting the following error. I also get another error occasionally when this seems to work, but I'm unable to reproduce it at the moment. I'll append it to this post if/when the first problem is solved.

Here is the query code:

        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);

In Dapper.cs on line 498:

var deserializer2 = (Func<IDataReader, TSecond>)info.OtherDeserializers[0];

info.OtherDeserializers is null which causes a NullReferenceException.

This is the guts of the stored procedure:

SELECT 
    RouteStops.StopID, 
    RouteStops.Name, 
    RouteStops.Description, 
    RouteStops.IsInbound, 
    RouteStops.Location.Lat as Latitude, 
    RouteStops.Location.Long as Longitude
FROM dbo.Routes

I开发者_运维技巧NNER 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

I've had an extensive look at the dapper code but I can't find anything that seems out of place other than that TFirst's deserialiser isn't null, but TSecond's is. Could there be a problem when it creates TSecond's deserializer that leaves it as null?

Here are the types:

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; }
}


Probably the main problem here is that you haven't told it how to "split"; try adding the parameter:

splitOn: "Latitude"

without that, as far as dapper can see there is no second result portion (it splits on Id by default).

0

精彩评论

暂无评论...
验证码 换一张
取 消