grimboite/articles/dev/2015-08-18-dapper.md

3.1 KiB

Title Date Tags Slug
Dapper .Net 2015-08-18 dev, dotnet, dapper, db, orm dapper-dot-net

Dapper est un wrapper pour le framework .Net qui étend, par des extensions de méthodes, les fonctionnalités présentes dans le namespace System.Data.Client pour la connexion à une base de données. En gros, on reste avec du code dans lequel on ouvre gentiment ses connexions et dans lequel on fait ses requêtes. à l'ancienne, mais en ajoutant un ensemble de fonctions 'achement utiles, comme par exemple Query<T> qui va faire correspondre les colonnes de la requête avec les champs d'une classe. On est un niveau plus bas qu'un ORM, mais un niveau plus haut qu'un client ADO.Net classique. On garde donc la main sur la construction de nos requêtes... Ce qui a ses avantages et inconvénients :)

En plus de cela, il existe le projet Dapper.Contrib, dans lequel on trouve notamment la classe SqlBuilder, qui permet d'améliorer la construction des requêtes. Son fonctionnement est un chouia touchy la première fois, mais fonctionne particulièrement bien au second tour :-) Tout fonctionne en fait sur base de templates et de clauses: on définit une requête de base dans laquelle des chaînes de caractères particulières seront remplacées par les clauses:

using Dapper;

SqlBuilder builder = new SqlBuilder();

var template = builder.AddTemplate(
    @"Select * From Table /**where**/");

builder.Where("EntityAttribute.[Key] = 'Route'");
builder.Where("EntityAttributeValue.EntityId = @entityid", new { entityid = entityId });

using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["RPS"].ConnectionString))
{
    var result = sqlConnection.Query<string>(template.RawSql, template.Parameters).Select(s => int.Parse(s));
}

En résumé, on crée un SqlBuilder et un template via la méthode AddTemplate. Puis on applique un ensemble de clauses via la méthode Where, sur notre nouveau builder. Le résultat sera ensuite généré en ouvrant une connection classique grâce à une nouvelle instance de SqlConnection, ouverte grâce à une chaîne de connexion disponible dans le ConfigurationManager. Ensuite, on utilisera la méthode Query<T> dont on parlait ci-dessus pour récupérer toutes les occurences de la db, en lui passant le template et les clauses en paramètres.

Bref, cela demande un peu de réflexion par rapport à une connexion classique, cela demande un peu plus de travail qu'un (micro-)ORM, mais cela permet également d'avoir un énorme contrôle sur les requêtes exécutées. Et après avoir essayé plusieurs ORM pour le framework .Net, j'en reviens toujours à cette solution-ci. En terme de performances, c'est sans équivalent (bien que je ne doute pas que le contraire existe :)).

Sources: