2011-10-05 80 views
4

我試圖用Dapper執行一個非常標準的多映射查詢,並且出現以下錯誤。我似乎也偶爾會遇到另一個錯誤,但目前我無法重現。如果/當第一個問題解決時,我會將其附加到此帖子。Dapper.NET多映射TSecond Deserializer爲null

下面是該查詢的代碼:

 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 

我已經在短小精悍的代碼廣泛的樣子,但我無法找到任何東西,似乎出比T第一的解串器ISN」其他地方t null,但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; } 
} 

回答

2

大概是這裏的主要問題是,你還沒有告訴它如何「分裂」;嘗試添加參數:

splitOn: "Latitude" 

而不是,只要hardy中可以看到沒有第二結果部(它由默認分割上Id)。

+0

謝謝,修復它。我很好奇splitOn是什麼,但找不到任何文檔或對它的直接解釋。 – George

+0

@喬治,這是公平的批評;實際上,在'Query <,,>'上它聲明'我們應該分割並讀取第二個對象的字段(默認:id)',但是該註釋在其他地方沒有被複制 –

+0

花費了3個小時在那一個,我敢肯定,如果谷歌代碼頁更新,很多人會感激:) – George