加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Dapper.NET多映射TSecond Deserializer为null

发布时间:2020-12-15 17:20:40 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Dapper执行非常标准的多映射查询,我收到以下错误.当这似乎有效时,我偶尔会得到另一个错误,但我现在无法重现它.如果/第一个问题解决了,我会将它附加到这篇文章中. 这是查询代码: const string storedProc = "dbo.GetStopsForRouteID"; var sto
我正在尝试使用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

我已经对dapper代码进行了广泛的研究,但除了TFirst的deserialiser不是null之外我找不到任何看似不合适的东西,但是TSecond是.当它创建TSecond的反序列化器并将其保留为null时会出现问题吗?

以下是类型:

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

解决方法

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

splitOn: "Latitude"

没有它,只要dapper可以看到没有第二个结果部分(默认情况下它在Id上分裂).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读