Reputation: 734
I use dapper and i have a mapping with more than 7 types.
I know that in dapper exists a method IEnumerable<TReturn> Query<TReturn>(this IDbConnection cnn, string sql, Type[] types, Func<object[], TReturn> map, [Dynamic] dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
and there is a reply here with very good example, but I can't resolve in my case.
Suppose to have this table
Table Poi(
Id,
Date,
LineId FK Line table,
TrackId FK Track table,
State_Id FK State table,
Type_Id FK Type table,
Category_Id FK Category table,
Processing_Id FK Processing table,
Vehicle_Id FK Vehicle table,
SystemId FK System table,
UnitId FK Unit table,
Speed)
a Poco like:
class Poi
{
public long Id { get; set; }
public DateTime Date { get; set; }
public float Speed { get; set; }
public State State { get; set; }
public Type PoiType { get; set; }
public Category Category { get; set; }
public Processing Processing { get; set; }
public Vehicles Vehicle { get; set; }
public Line Line { get; set; }
public Track Track { get; set; }
public System System { get; set; }
public Unit Unit { get; set; }
}
and suppose that have this sql query
select select poi.*, ps.Id, ps.Name, pt.name,pt.id,pc.id,pc.name,pc.issystem,processing.id,processing.name,processing.date, v.name,v.id,
t.id,t.name,t.code, ds.name, ds.id, du.id, du.name from Poi poi
left join State ps on poi.State_Id = ps.Id
left join Type pt on poi.PoiType_Id = pt.Id
left join Category pc on poi.Category_Id = pc.Id
left join Processing processing on poi.Processing_Id = processing.Id
left join Vehicles v on poi.Vehicle_Id = v.Id
left join Line l on poi.LineId = l.Id
left join Track t on poi.TrackId = t.Id
left join DiagSystem ds on poi.SystemId = ds.Id
left join DiagUnit du on poi.UnitId = du.Id
Now, based on reply attached, i call the method with this parameters
connection.Query<Poi>(sql,
new[]
{
typeof(Poi),
typeof(State),
typeof(Type),
typeof(Category),
typeof(Processing),
typeof(Vehicles),
typeof(Line),
typeof(Track),
typeof(System),
typeof(Unit)
},
objects =>
{
Poi poi = objects[0] as Poi;
State ps = objects[1] as State;
Type pt = objects[2] as Type;
Category pc = objects[3] as Category;
Processing processing = objects[4] as Processing;
Vehicles v = objects[5] as Vehicles;
Line l = objects[6] as Line;
Track t = objects[7] as Track;
System ds = objects[8] as System;
Unit du = objects[9] as Unit;
poi.State = ps;
poi.Type = pt;
poi.Category = pc;
poi.Processing = processing;
poi.Vehicle = v;
poi.Line = l;
poi.Track = t;
poi.System = ds;
poi.Unit = du;
return poi;
},
new { Value = value }
,splitOn: "State_Id,PoiType_Id,Category_Id,Processing_Id,Vehicle_Id,LineId,TrackId,SystemId,UnitId"
).ToList();
but i continue to receive same error, about multimapping:
'System.ArgumentException' in Dapper.dll
Additional information: When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id
do you think that there is a error in spliton parameters??I don't understand!
Upvotes: 6
Views: 4531
Reputation: 26
Instead of:
select poi.*, ps.Id, ps.Name, pt.name,pt.id
splitOn: "State_Id,PoiType_Id"
Try this :
select poi.*, ps.Id, ps.Name, pt.id, pt.name
splitOn: "Id,Id"
"State_Id" is the foreign key in Poi. Try splitting on "Id" instead. Also, make sure the primary key is first in the select. Dapper puts the first set of columns in the first object, the second set (starting with first split) in second object, and so on.
Dapper defaults to splitting on "Id" so after these changes you can use the default value of splitOn.
Upvotes: 1