Aller au contenu principal

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.

Snowfall.Web.Mvc/Controllers/EvenementsController.cs
public IActionResult Index()
{
string sql = @"
SELECT * from evenements;
";

using (IDbConnection connection = new NpgsqlConnection(_connectionString))
{

}
return View(new List<Evenement>());
}
  • using: l'utilisation de using 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());
}
}
info

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 fonction Query sur la connexion est fournie par Dapper, tel qu'expliqué précédemment.
  • Query<Evenement>: On a précisé <Evenement> à la fonction Query et c'est à partir de cette information que Dapper fera son travail de mapping. Dapper essaiera de faire le mapping entre le retour de base de données et la classe Evenement.
  • 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, comme List.
  • return View(evenements.ToList());: La liste d'événements IEnumerable, convertie en List pour satisfaire la vue qui s'attend à recevoir un objet de type List<Evenement>.

Lancer l'application

Si vous lancez l'application, vous devriez avoir le contenu de votre base de données!

attention

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.

http://localhost:5155/

party-cat