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

dapper コードを詳しく調べましたが、TFirst のデシリアライザーが null ではなく、TSecond のデシリアライザーが null であること以外に、場違いに見えるものは見つかりません。null のままにする 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 が見る限り、2 番目の結果部分はありません(デフォルトで分割さIdれます)。

于 2011-10-05T05:41:03.667 に答える