Ich habe das:
public class object_a
{
public int ta_Id { get; set; }
public string ta_Label { get; set; }
public IEnumerable<table_c> SomeName { get; set; }
}
public class table_b
{
public int Id {get;set;}
public int SomeId {get;set;}
public int FK_A {get;set;}
}
public class table_c
{
public int Id {get;set;}
public int Max {get;set;}
public string Label {get;set;}
public int FK_A {get;set;}
}
Mit Dapper object_a
ich eine Liste von object_a
mit einer beliebigen Anzahl von Kind-Objekten table_c
using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(_con))
{
sqlConnection.Open();
var sql = string.Format(
@"
select ta.Id as ta_Id, ta.Label as ta_label, splitLimit = '', tc.Id, tc.Max, tc.Label
from table_a as ta
left join table_b as tb
on tb.FK_A = ta.Id
left join table_c as tc
on tc.FK_A = ta.Id
where tb.SomeId = SomeInt);
var items = sqlConnection.Query<object_a, IEnumerable<table_c>, object_a>(sql, (a, c) => { a.c = table_c; return a; }, splitOn: "splitLimit");
return items;
}
Wenn ich den Dapper-Code von einem Controller aus anrufe, erhalte ich folgende Fehlermeldung:
Ein parameterloser Standardkonstruktor ist erforderlich, um eine bessere Materialisierung zu ermöglichen
Ich habe es auch versucht:
var items = sqlConnection.Query<object_a,IEnumerable<table_c>, object_a>(sql, (a, c) =>
{
if (c!= null)
{
a.SomeName = c;
}
return a;
}, splitOn: "splitLimit");
Ich denke, dass es etwas mit dem IEnumerable<table_c>
zu tun hat, aber ich verstehe nicht, was ich hier falsch mache. Ich habe verwandte Fragen gelesen, die SO nahelegen, aber ich verstehe es nicht.
Ich würde gerne wissen, was ich falsch mache und was der richtige Code ist. Vielen Dank!
Das Problem ist das IEnumerable<>
, hier:
Query<object_a, IEnumerable<table_c>, object_a>
Dapper kann kein IEnumerable<table_c>
erstellen, und es wird nie gehen. Die Art, wie diese Methode funktioniert, soll sein:
Query<object_a, table_c, object_a>
Dann erstellt object_a
für jede Zeile ein object_a
und ein table_c
aus der Zeile und verwendet dann die von Ihnen bereitgestellte Methode, um die beiden zu kombinieren. Derzeit verfügen wir über keinen integrierten Code für die identitätsbasierte Aggregation, der jedoch in der benutzerdefinierten Methode hinzugefügt werden könnte. Beispielsweise wird versucht, wiederholte object_a
Instanzen zusammenzufassen:
var identityMap = new Dictionary<int, object_a>();
var data = Query<object_a, table_c, object_a>(sql, (a, c) => {
object_a master;
if(!identityMap.TryGetValue(a.ta_id, out master)) {
identityMap[a.ta_id] = master = a;
}
var list = (List<table_c>)master.SomeName;
if(list == null) {
master.SomeName = list = new List<table_c>();
}
list.Add(c);
return master;
}, ...).Distinct().ToList();