Ich arbeite mit einer Datenbank, die an einigen Stellen leicht inkonsequent ist. Zum Beispiel gibt es zwei Stored Procedures, die im Grunde die exakt gleiche Resultset-Struktur zurückgeben, aber aus irgendeinem Grund hat der DBA das erste Feld anders als das andere benannt. Ich möchte nicht zwei getrennte Modelle erstellen, um diese Daten zu kapseln.
Kann ich Dapper so einstellen, dass beide Ergebnismengen auf dasselbe Objekt abgebildet werden?
Zum Beispiel gibt sp_GetSomeDataByQtr
eine Ergebnismenge wie sp_GetSomeDataByQtr
zurück:
Qtr int,
Lines int,
Balance money
While, sp_GetSomeDataByMonth
gibt eine Ergebnismenge wie sp_GetSomeDataByMonth
zurück:
Mo int,
Lines int,
Balance money
Ich möchte beide in ein Objekt wie z
public class MyData {
public int Term { get; set; } //This would be Qtr OR Mo depending on which SP is called.
public int Lines { get; set; }
public decimal Balance { get; set; }
}
Also, dann mit Dapper:
MyData data = connection.Query<MyData>("sp_GetSomeDataByQtr", ...).FirstOrDefault();
oder:
MyData data = connection.Query<MyData>("sp_GetSomeDataByMonth", ...).FirstOrDefault();
Wir können die Stored Procedures nicht direkt ändern, da Legacy-Anwendungen auch Daten von ihnen abrufen und abhängig von diesen Spaltennamen.
Gibt es eine Möglichkeit, dies mit Dapper zu tun? Ich weiß, dass Sie benutzerdefinierte Typzuordnungen einrichten können, aber ich bin nicht sicher, wie es geht, wenn Sie versuchen, mehrere Spaltennamen einer einzelnen Eigenschaft eines Objekts zuzuordnen.
Was ist mit etwas wie unten? Dapper füllt Mo oder Lines abhängig von der gespeicherten Prozedur, aber Sie können den Wert immer aus der Eigenschaft Term lesen.
public class MyData
{
public int? Mo { get; set; }
public int? Lines { get; set; }
public decimal Balance { get; set; }
public int Term
{
get
{
if (Mo == null && Lines != null)
{
return Lines.Value;
}
if (Mo != null && Lines == null)
{
return Mo.Value;
}
return default(int);
}
}
}