Comment utiliser SqlBuilder de Dapper?

dapper sqlbuilder

Question

Je ne trouve aucune documentation ou exemple que je puisse suivre pour utiliser la classe SqlBuilder.

J'ai besoin de générer des requêtes SQL de manière dynamique et j'ai trouvé cette classe. Serait-ce la meilleure option?

Réponse acceptée

Le meilleur endroit pour commencer est d' extraire le code source de Dapper de son dépôt github et d'examiner le code SqlBuilder . La classe SqlBuilder ne contient que 200 lignes environ et vous devriez être en mesure de faire un choix éclairé pour savoir si elle convient à vos besoins.

Une autre option consiste à créer le vôtre. Je me suis personnellement engagé dans cette voie car cela avait du sens. Dapper mappe les requêtes directement sur une classe si vous nommez vos propriétés de classe de la même manière que votre base de données ou ajoutez un attribut tel que displayName à mapper. Vous pouvez utiliser la réflexion pour obtenir les noms de propriété. Mettez-y des noms et des valeurs dans un dictionnaire et vous pourrez générer des SQL assez facilement à partir de là.

voici quelque chose pour vous aider à démarrer:

d'abord un exemple de classe que vous pouvez transmettre à votre sqlbuilder.

public class Foo
{

    public Foo()
    {
       TableName = "Foo";
    }
    public string TableName { get; set; }

    [DisplayName("name")]
    public string Name { get; set; }

    [SearchField("fooId")]
    public int Id { get; set; }

}

C'est assez basique. L'idée derrière l'attribut DisplayName est que vous pouvez séparer les propriétés que vous souhaitez inclure dans votre génération automatique. Dans ce cas, TableName ne possède pas d'attribut DisplayName et ne sera donc pas pris en compte par la classe suivante. Cependant, vous pouvez l'utiliser manuellement lors de la génération de votre fichier SQL pour obtenir le nom de votre table.

public Dictionary<string, object> GetPropertyDictionary()
    {
        var propDictionary = new Dictionary<string, object>();

        var passedType = this.GetType();

        foreach (var propertyInfo in passedType.GetProperties())
        {
            var isDef = Attribute.IsDefined(propertyInfo, typeof(DisplayNameAttribute));

            if (isDef)
            {
                var value = propertyInfo.GetValue(this, null);

                if (value != null)
                {
                    var displayNameAttribute =
                        (DisplayNameAttribute)
                            Attribute.GetCustomAttribute(propertyInfo, typeof(DisplayNameAttribute));
                    var displayName = displayNameAttribute.DisplayName;
                    propDictionary.Add(displayName, value);
                }
            }
        }

        return propDictionary;
    }

Cette méthode examine les propriétés de sa classe et, si elles ne sont pas nulles et qu'un attribut displayname les ajoute à un dictionnaire avec la valeur displayname comme composant de chaîne.

Cette méthode est conçue pour fonctionner dans le cadre de la classe de modèle et doit être modifiée pour fonctionner à partir d'une classe auxiliaire distincte. Personnellement, je l'ai et toutes mes autres méthodes de génération SQL dans une classe de base dont tous mes modèles héritent.

Une fois que vous avez les valeurs dans le dictionnaire, vous pouvez l'utiliser pour générer dynamiquement SQL basé sur le modèle que vous avez entré. Vous pouvez également l'utiliser pour remplir votre DynamicParamaters dapper avec sql paramétré.

J'espère que cela vous aidera à résoudre vos problèmes.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi