Compruebe nulo para el parámetro de lista en Dapper

dapper parameters

Pregunta

¿Hay alguna manera de verificar null cuando el tipo de parámetro es un IEnumerable? Sé que Dapper traducirá el parámetro de la lista en una consulta parametrizada, así que sospecho que esa es la razón por la cual no se puede verificar el parámetro de lista para nulo, pero me preguntaba si hay una forma de lograr ese comportamiento.

La idea es hacer algo como esto:

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

En este momento, esa consulta arroja SqlException con el mensaje: debe declarar la variable escalar "@ids". Sintaxis incorrecta cerca ')'.

Respuesta aceptada

El id in @ids es un patrón que es reconocido por el dapper y se trata como una expansión , por lo que dependiendo de la cantidad de elementos en los ids entrada, podría convertirse en uno de los siguientes:

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

Debido a esto, después de la expansión, no hay @ids parámetro / variables - por lo @ids IS NULL no se va a trabajar. Como tal, propongo que la mejor manera de hacer esto en su caso es simplemente: no agregue esa parte del tsql. Por ejemplo:

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();


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow