7-4 Première requête Dapper
La requête SQL est écrite, mais il n'y a toujours pas de connexion avec la BD, ni d'utilisation de l'ORM Dapper.
Ouvrir une connexion
Dans un premier temps, ouvrons une connexion à la BD à l'aide de NpgsqlConnection
. C'est ici qu'entre en jeu la librairie Npgsql
installée précédemment.
public IActionResult Index()
{
string sql = @"
SELECT * from evenements;
";
using (IDbConnection connection = new NpgsqlConnection(_connectionString))
{
}
return View(new List<Evenement>());
}
using
: l'utilisation deusing
dans ce contexte nous assure que l'objet de connexion sera disposé correctement à la fin de l'exécution, même dans le cas où une erreur surviendrait. On s'assure ainsi de ne pas laisser de connexion ouverte inutilement.NpgsqlConnection
: Ouvre une connexion à une base de données PostgreSQL en utilisant le ConnectionString fourni.IDbConnection
: représente une connexion à une source de données. .NET fait largement usage des interfaces comme type de retour. L'idée est que l'interface est un contrat et ne dépend pas de l'implémentation concrète de la classe de retour. On est ainsi moins sujet aux changements, mais c'est essentiellement un choix d'architecture et non un "absolu".
Exécuter la requête
Ensuite, on effectue la requête à l'aide de la connexion créée et de Dapper, via la fonction Query
.
public IActionResult Index()
{
string sql = @"
SELECT * from evenements;
";
using (IDbConnection connection = new NpgsqlConnection(_connectionString))
{
IEnumerable<Evenement> evenements = connection.Query<Evenement>(sql);
return View(evenements.ToList());
}
}
On ne voit pas directement l'utilisation de Dapper, dans le sens où on n'appelle pas une classe ou un objet nommé Dapper
pour effectuer la requête.
Dapper utilise plutôt le concept d'extensions pour ajouter des fonctions au type IDbConnection
.
Si vous inspectez la fonction Query
(F12), vous verrez que la signature de la fonction ressemble à ceci:
public static IEnumerable<dynamic> Query(this IDbConnection cnn, ...)
L'utilisation de this IDbConnection
signifie une extension (ajout de fonction sur le type IDbConnection
).
Dapper ajoute plusieurs fonctions sur l'objet de connexion, bien qu'on ne voit pas la référence directement, il n'y a pas de magie! 😉
Dapper fournit plusieurs autres fonctions sur le type IDbConnection
:
- Query
- QueryFirst
- QuerySingle
- ...
Nous aurons l'occasion plus loin d'explorer plus en détail d'autres fonctions.
Query
: La fonctionQuery
sur la connexion est fournie parDapper
, tel qu'expliqué précédemment.Query<Evenement>
: On a précisé<Evenement>
à la fonctionQuery
et c'est à partir de cette information que Dapper fera son travail demapping
. Dapper essaiera de faire le mapping entre le retour de base de données et la classeEvenement
.IEnumerable<Evenement> evenements
:Query
retourne une liste du type demandé (Evenement) sous la forme de IEnumerable. C'est un format très large qui permet de convertir ensuite à un format plus précis, commeList
.return View(evenements.ToList());
: La liste d'événements IEnumerable, convertie enList
pour satisfaire la vue qui s'attend à recevoir un objet de typeList<Evenement>
.
Lancer l'application
Si vous lancez l'application, vous devriez avoir le contenu de votre base de données!
C'est normal si vos images d'événement ne s'affichent pas à cette étape, le lien dans les vues n'est pas le bon, nous y reviendront.
