Vérifiez la valeur null pour le paramètre de liste dans Dapper

dapper parameters

Question

Est-il possible de vérifier la valeur null lorsque le type de paramètre est un IEnumerable? Je sais que Dapper traduira le paramètre de liste en une requête paramétrée, donc je soupçonne que c'est la raison pour laquelle le paramètre de liste ne peut pas être vérifié pour null, mais je me demandais s'il y avait un moyen d'obtenir ce comportement.

L'idée est de faire quelque chose comme ça:

select * from Table1 where (@ids IS NULL OR id in @ids)

En ce moment, cette requête renvoie SqlException avec le message suivant: Doit déclarer la variable scalaire "@ids". Syntaxe incorrecte près de ')'.

Réponse acceptée

L' id in @ids est un modèle reconnu par dapper et traité comme une extension . Ainsi, en fonction du nombre d'éléments dans vos ids entrée, cela pourrait devenir l'un des:

(1 = 0) -- empty sequence
(id = @ids_0) -- sequence with 1 element
(id in (@ids_0, @ids_1, ...)) -- sequence with multiple elements

À cause de cela, après l'expansion, il n'y a pas @ids paramètre / variable - alors @ids IS NULL ne va pas fonctionner. En tant que tel, je propose que la meilleure façon de le faire dans votre cas est simplement: n’ajoutez pas cette partie du tsql. Par exemple:

var sql = new StringBuilder("select * from Table1");
if(ids != null && ids.Any())
{
    sql.Append(" where id in @ids");
}
var data = conn.Query<SomeType>(sb.ToString(), new { ids }).ToList();


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