Mit Dapper QueryAsync zum zurückgeben eines einzelnen Objekts
Leider unsere DB ist datiert zurück bis in die 90er Jahre. Sein Vermächtnis ist so stark, dass wir immer noch mit SP damit zu tun, die meisten die CRUD-Operationen. Es scheint jedoch, dass Dapper Anzüge sehr gut und wir haben gerade angefangen zu spielen mit.
Allerdings bin ich ein wenig besorgt über den Umgang mit einer einzigen Datenzeile. In diesem Fall bin ich mit QueryAsync zu rufen, die SP die übergabe einer ID. Wie Sie sehen können, das Objekt ist die Rückgabe außerhalb der async-Aufruf(*).
Werde ich in Schwierigkeiten sein? Wenn ja, weiß jemand, wie es zu handhaben? Brauche ich eine QuerySync statt?
public class SchemePolicyRepository : ISchemePolicyRepository
{
private readonly SqlConnection sql;
protected SchemePolicyRepository(SqlConnection connection)
{
sql = connection;
}
...
public async Task<SchemePolicy> GetById(string id)
{
var schemePolicy = await sql.QueryAsync<SchemePolicy>("risk.iE_GetSchemePolicyById",
new { Id = id },
commandType: CommandType.StoredProcedure);
return schemePolicy != null ? schemePolicy.FirstOrDefault() : null;
}
...
}
(*)Die SchemePolicy Objekt zurückgegeben FirstOfDefault() ist nicht eine async-Methode.
- Wie Sie sehen können, ist das Objekt nicht zurückgeben, aus der async-Aufruf. Was bedeutet das? Sie bedeuten, dass Ihre Abfrage nicht funktioniert?
- Es ist nichts falsch mit gespeicherte Prozeduren sind SQL-genau wie die schweren, langsamer ORMs generieren.
- Danke @YuvalItzchakov, ich habe aktualisiert die post
- Sie haben Recht, das ist, warum wir verwenden bevorzugt Dapper anstelle von EF. Die alte Mode ADO.NET ist noch etwas, das wir lieben, hier zu verwenden 🙂
- Also im Grunde, Sie sind besorgt, weil
FirstOrDefault
ist nicht async? - Richtig!!!! @YuvalItzchakov
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, ich glaube nicht, dass Sie müssen die
null check
, Dapper zurück-null-Zeilen für eine Abfrage. BEACHTEN Sie, dass dies WAHR fürSQL Server
aber sollte das gleiche für jedes andere RDBMS. Also daseinfach so geschrieben, wie
Jetzt etwas gegen die eigentliche Sorge, und Sie erwähnt:
Dass ist nicht wahr. Wenn Sie es schreiben, entweder, wie Sie NUR bekommen Ihr Objekt, nachdem die Abfrage ausgeführt wurde. So wird der folgende Satz zwei codes geben das gleiche Verhalten:
und
Die Sorge ist wirklich jetzt mit der Art, wie Sie Sie nennen
GetById
um sicherzustellen, dass (1) die Methode nicht blockiert alle anderen Threads und (2), dass Sie Ihre Zielobjekt NUR, wenn die Abfrage ausgeführt hat. Hier ist ein snippet für eine Konsole App, können Sie es testen mit:Test wird Ihnen zeigen, dass
GetValue
fordert folglich, dass dieGetById
Methode blockiert nicht den rest des Codes. Auch, dass nichts zurückgegeben wirdFirstOrDefault
bis die Abfrage verarbeitet wurde.Hier ist die Unterstützung der code für die Abfrage in den Fall, dass jemand will, um zu versuchen und stellen Sie sicher, dass das Konzept gültig ist (code funktioniert mit SQL-Server 2008 und höher):
Dapper unterstützt
QueryFirstOrDefaultAsync()
heutzutage, so könnte man den code schreiben, wie diese,