¿Cómo obtengo un nullable int [] con dapper?

c# dapper sql-server-2008

Pregunta

Si quiero obtener un grupo de filas que contengan una sola columna de int , usando Dapper, es posible que este conjunto de resultados esté vacío. ¿Cuál es la mejor manera de usar Dapper para consultar estos datos?

Por ejemplo, si tengo el siguiente método que devuelve lo que quiero:

public void int[] GetInts()
{

    conn.Query<int?>("select 123 where 1=1")
        .Where(x=> x.HasValue)
        .Select(x => x.Value)
        .ToArray();
}

Si cambio la línea a esto:

conn.Query<int>("select 123 where 1=0").ToArray();

Recibo un error de lanzamiento cuando no hay resultados.

El Stack Trace está debajo y la excepción es solo una referencia de objeto no configurada como instancia de un objeto cuando se lanza (T)next :

at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in .\SqlMapper.cs:line 611
 at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)   
  at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)    
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in .\SqlMapper.cs:line 539

Respuesta aceptada

Mi problema resultó ser que estaba haciendo una LEFT JOIN en el código, pero mientras intentaba reproducir el error estaba usando una INNER JOIN , así que no pude reproducir el mismo comportamiento. Con LEFT JOIN , se devolvió una sola fila con el valor de NULL por lo que obtuve un error de conversión entre NULL e int .


Respuesta popular

Bueno, Where y Select no tienen sentido si es un int. Seguro que quieres eliminarlos.

conn.Query<int>("select 123 where 1=0")
    .ToArray();

¿Tienes algún problema cuando haces eso?



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