Verwenden von Dapper zum Auffüllen von Objekten aus einer T-SQL-Ansicht

c# dapper multi-mapping

Frage

Ich versuche, Dapper für meinen Datenzugriff zu verwenden (in ASP.NET MVC3 FWIW). Ich habe eine T-SQL-Ansicht (in SQL Server), die in etwa so aussieht:

SELECT s.*, c.CompanyId AS BreakPoint c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

So ziemlich einfach. Im Wesentlichen eine Liste von Mitarbeitern, von denen jeder eine einzige Firma hat.

Das Problem, das ich habe, ist, dass ich versuche, die Ausgabe dieser Abfrage auf meine POCOs abzubilden, aber weil jedes Feld in der Ansicht eindeutig sein muss (dh CompanyName anstelle von Name, der bereits in tblStaff existiert), ist das Mapping zu POCOs funktioniert nicht.

Hier ist der Code:

var sql = @"select * from qryStaff";
var people = _db.Query<Person, Company, Person>(sql, (person, company) => {person.Company = company; return person;}, splitOn: "BreakPoint");

Irgendein Rat, wie ich dieses Rätsel lösen könnte? Ich bin offen dafür, die Art und Weise zu ändern, wie ich Ansichten mache, denn gerade bin ich ratlos, wie es weitergeht.

Beliebte Antwort

Sie sollten alle von Ihrer Ansicht zurückgegebenen Felder explizit auflisten (keine Sternchen!). Wenn die Feldnamen nicht eindeutig sind, verwenden Sie zur Deduplizierung Aliasnamen. Als Beispiel:

SELECT 
    s.CompanyName as CompanyName1, 
    s.BreakPoint as BreakPoint1,
    ...
    c.CompanyId AS BreakPoint,
    c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

Die aufgelisteten Felder und die von Ihnen verwendeten Aliasnamen hängen natürlich ganz von Ihrem Code ab. Normalerweise passen Sie die Aliase in Ihrer Abfrage so an, dass sie den Eigenschaftennamen des POCO entsprechen.

Als Faustregel gilt, dass Sie in SQL-Abfragen keine Platzhalterzeichen verwenden müssen, da Probleme wie diese auftreten. Hier ist ein anständiger Artikel über bewährte Methoden für SQL-Abfragen.

Auszug:

Die Verwendung von expliziten Namen von Spalten in Ihren SELECT-Anweisungen in Ihrem Code hat eine Reihe von Vorteilen. Erstens gibt SQL Server nur die Daten zurück, die Ihre Anwendung benötigt, und nicht einige zusätzliche Daten, die Ihre Anwendung nicht verwendet. Indem Sie nur die Daten zurückgeben, die Sie benötigen, optimieren Sie den Arbeitsaufwand, den SQL Server ausführen muss, um alle erforderlichen Informationssäulen zu erfassen. Wenn Sie die Sternchen (*) - Nomenklatur nicht verwenden, minimieren Sie außerdem den Netzwerkverkehr (Anzahl Bytes), der erforderlich ist, um die mit Ihrer SELECT-Anweisung verknüpften Daten an Ihre Anwendung zu senden.

Indem Sie Ihre Spalten explizit benennen, isolieren Sie Ihre Anwendung außerdem vor potenziellen Fehlern, die mit einer Änderung des Datenbankschemas in Zusammenhang stehen, die bei Tabellen auftreten kann, auf die Sie in Ihrer SELECT-Anweisung verweisen. Wenn Sie die Sternenklasse (*) verwenden und jemand einer Tabelle eine neue Spalte hinzufügen würde, würde Ihre Anwendung damit beginnen, Daten für diese zusätzliche Datenspalte zu erhalten, auch ohne Ihren Anwendungscode zu ändern. Wenn Ihre Anwendung nur eine bestimmte Anzahl von Spalten erwartet, die zurückgegeben werden sollen, schlägt die Anwendung fehl, sobald jemand einer Ihrer referenzierten Tabellen eine zusätzliche Spalte hinzugefügt hat. Durch die explizite Benennung von Spalten in Ihrer SELECT-Anweisung erhält Ihre Anwendung daher immer die gleiche Anzahl von zurückgegebenen Spalten, selbst wenn jemand einer der in Ihrer SELECT-Anweisung referenzierten Tabellen eine neue Spalte hinzufügt.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum