Requête paramétrée dynamique avec dapper

c# dapper oracle sql

Question

Je veux écrire une requête avec une liste dynamique de paramètres (selon que le paramètre est défini ou non). Je veux exécuter la requête sur une base de données Oracle à l'aide de dapper.

Exemple de code:

        var sqlParams = new List<object>();
        var sqlBuilder = new StringBuilder();
        sqlBuilder.Append("SELECT * FROM EXAMPLE WHERE 1 = 1 ");

        if (!string.IsNullOrEmpty(aParam))
        {
            sqlBuilder.Append(" AND A LIKE ?");
        }

        if (!string.IsNullOrEmpty(bParam))
        {
            sqlBuilder.Append(" AND B LIKE ? ");
        }

        var sql = sqlBuilder.ToString();

        return this.Connection.Query<Equipment>(
            sql,
            new { aParam, bParam }   // ??
            ).ToList();

Réponse acceptée

Dapper ne fonctionne vraiment qu'avec des paramètres nommés. Il me semble rappeler que, dans oracle, ils sont préfixés par le côlon, donc:

if (!string.IsNullOrEmpty(aParam))
{
    sqlBuilder.Append(" AND A LIKE :aParam");
}

if (!string.IsNullOrEmpty(bParam))
{
    sqlBuilder.Append(" AND B LIKE :bParam");
}

Maintenant votre code existant ici:

return this.Connection.Query<Equipment>(
    sql,
    new { aParam, bParam }
    ).ToList();

devrait marcher. Dapper utilise les noms des membres du type anonyme comme noms de paramètre. Il inclut en outre un code très basique pour vérifier si un membre donné n'existe pas dans le sql, donc si SQL ne mentionne que :bParam , il n'ajoutera pas la valeur aParam comme paramètre.

Dans les scénarios plus compliqués, il existe également un objet DynamicParameters vous pouvez utiliser, qui fonctionne plus comme un dictionnaire, mais vous n'en avez pas besoin ici.



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