Wenn Sie den multi-mapping-APIs sicherstellen, dass Sie legen Sie die splitOn param, wenn Sie die Schlüssel anderer als Id", "splitOn mit Mehreren Beziehungen
Bekomme ich die folgende exception wenn ich versuche, um diese Methode ausführen :
Wenn Sie den multi-mapping-APIs sicherstellen, dass Sie legen Sie die splitOn param, wenn
Sie haben die Tasten andere als die Id“
public static IEnumerable<FinancePositionList> GetFinancialListsForConsecutiveYears(int year, int periodTypeId, int period)
{
IEnumerable<FinancePositionList> resultList;
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Finance"].ConnectionString))
{
conn.Open();
StringBuilder query = new StringBuilder();
query.Append("SELECT b.CompanyId,b.CompanyName,[Year]");
query.Append(",CreationDate,AccruedExpenses,AdvancePaymentsToContractors");
query.Append("FROM finance.FinanceList a INNER JOIN finance.Company b ");
query.Append("ON a.CompanyId = b.CompanyId ");
query.Append("INNER JOIN finance.ListPeriod c ");
query.Append("ON c.FinanceListId = a.FinanceListId ");
query.Append("WHERE Discriminator = " + "'" + "FinancePositionList" + "' ");
query.Append("AND[Year] IN @years ");
query.Append("AND c.PeriodTypeId = @PeriodTypeId AND c.Period = @Period ");
query.Append("ORDER BY b.CompanyId, a.[Year] DESC ");
resultList = conn.Query<FinancePositionList, Company,ListPeriod, FinancePositionList>(query.ToString(),
(a, b,c) =>
{
a.Company = b;
c.FinanceList = a;
return a;
},
new
{
years = new[] { year, year - 1 },
PeriodTypeId = periodTypeId,
Period = period
},
splitOn: "CompanyId,FinanceListId").AsEnumerable();
}
return resultList;
}
EDIT :
Löse ich das problem nun, indem Sie die Reihenfolge der Spalten so :
Aber ich Frage mich, ob es gibt weitere Verbesserung der code könnte ich tun ?
public static IEnumerable<FinancePositionList> GetFinancialListsForConsecutiveYears(int year, int periodTypeId, int period)
{
IEnumerable<FinancePositionList> resultList;
using (var conn = new SqlConnection(ResolveConnectionString()))
{
conn.Open();
StringBuilder query = new StringBuilder();
query.Append("SELECT CreationDate,AccruedExpenses,AdvancePaymentsToContractors,[Year]");
query.Append(",b.CompanyId,b.CompanyName,c.FinanceListId ");
query.Append("FROM finance.FinanceList a INNER JOIN finance.Company b ");
query.Append("ON a.CompanyId = b.CompanyId ");
query.Append("INNER JOIN finance.ListPeriod c ");
query.Append("ON c.FinanceListId = a.FinanceListId ");
query.Append("WHERE Discriminator = " + "'" + "FinancePositionList" + "' ");
query.Append("AND [Year] IN @years ");
query.Append("AND c.PeriodTypeId = @PeriodTypeId AND c.Period = @Period ");
query.Append("ORDER BY b.CompanyId, a.[Year] DESC ");
resultList = conn.Query<FinancePositionList, Company, ListPeriod, FinancePositionList>(query.ToString(),
(a, b, c) =>
{
a.Company = b;
a.CompanyId = b.CompanyId;
a.FinanceListId = c.FinanceListId;
return a;
},
new
{
years = new[] { year, year - 1 },
PeriodTypeId = periodTypeId,
Period = period
},
splitOn: "CompanyId,FinanceListId").AsEnumerable();
}
return resultList;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie meist falsch verstanden, die Arbeit der
Multimapping
mitDapper
die Abfrage gibt die folgenden Spalten:Nun die in der
multimapping
- code, nach der dapperQuery
überlastung, die Sie anrufen (geprüft von dersource code
):Ich früher missverstanden die Allgemeine nennen, aber jetzt, wie es scheint, Problem ist nur mit der Multi-mapping type-mapping mit Hilfe SplitOn, die Sie bereits korrigiert, daher würde funktionieren, sofern die richtigen
spliton
Spalten in das AbfrageergebnisNun nur Punkt bleibt zu klären, wie ich schon geschrieben im Kommentar funktioniert der
years
parameter, die meist eineinteger array
für die aktuelle Abfrage, die alle text -, dies würde funktionieren, aber nicht für diestored procedures
, wo Sie es erwarten würden, die gleiche mitDataTable
mit gleichen Reihenfolge und Namen der Spalten, wie die Abholung kann geliefert werden nur mitTable Valued Parameters
. Ich denke jede weitere änderung erforderlich ist, um den aktuellen Anwendungsfall.Bearbeiten, um ein Beispiel von Anonymous Parameter und Dynamische Parameter:
AnonymousParameters
Diesem einfachen, anonymen Typ in C#, überprüfen hier, die Idee ist, die Sie liefern können alle Parameter über einfache Platzhalter wie
{max = <value>,min=<value>}
oder sogar wie es ist, wenn die Namen übereinstimmen{max,min}
, in beiden Fällen werden die Parameter sind@max
und@min
-, Fall-egal, Sie werden mit der dieAnonymousParameters
im code für die Parameteryears, PeriodTypeId, Period
es werden Rückschlüsse auf die Art und andere details intern und würde davon ausgehen, alle input-ParameterDynamische Parameter
Sind Sie mehr wie Parameter-Klasse in Ado.Net, was bekommt Sie zum hinzufügen eines Parameters explizit, sind die überlastungen in den Dapper-code, geben Sie alle Informationen, wie
Type, Direction
etc explizit (code-snippet aus dapper source-code):Dapper
nach Empfehlungen . Ich habe hier eine Frage, wenn ich diefirst
wie zu meinen Parametern . alles was ich tun möchte hier ist zum ausführen einer Abfrage mehrere joins erlauben, Parameter übergeben, also Tat ich das .query.Append(",TradeAndPayables,TradeReceivables,TradingInvestments,[Year] "); query.Append(",b.CompanyId,b.CompanyName,c.FinanceListId ");
die Reihenfolge der Spalten Ändern, nachdem ich die Idee hintersplit
und es funktioniert gut, aber ich wollen, dass jede Erweiterung die MethodeAnonymous types
,Dynamic Parameters
,und Sie hatte gesagt, dass mit beiden von Ihnen ist völlig falsch. aber jetzt schreiben die gleiche Abfrage Könnte man klären, die Idee bitte ?Anonymous types
oderDynamic Parameters
gibt es keine andere option, die die übergabe der Parameter ist, kann ich nicht sagen, beide sind falsch :). Einziger Punkt istAnonymous types
können nur verwendet werden für die Eingabeparameter. Ich fehlinterpretiert zunächst der überlastung verwendet, die ich überprüft auf der ganzen Linie. Wie erwähnt, off spät, Sie haben nur zwei Interessen hier 1. korrekte Verwendung von multi-Karte (die Sie korrigiert haben, posten das Verständnis der Nutzung). 2. Wenn die gleichen verschoben, um Gespeicherte Prozeduren, dannyears
parameter umgewandelt werden müssen, in die DataTable.Dynamic Parameters
können Sie alle Arten von Parameter wie die Ausgabe, Rückgabe zusammen mit der Eingabe, falls erforderlich, was nicht möglich istAnonymous Type
sind, da Sie nur verwendet für die Input Parameter.