¿Cómo obtengo Dapper para mapear una propiedad int a boolean

.net dapper

Pregunta

Tengo esta clase ...

public class MyDTO
{
    public int Id { get; set; }

    public bool Selected { get; set; }
}

y luego usa dapper para intentar crear una lista como esta ...

            var list = this.db.OpenConnection().Query<MyDTO>(
            @"SELECT T1.id, T2.id IS NOT NULL AS selected
            FROM     table1 T1
            LEFT
            JOIN     table2 T2 
            ON   T2.id = T1.id
            AND  Tl.id = @Id",
            new { Id = id });

que devuelve un conjunto de resultados como este ....

id  selected
 9         0
10         1
11         1
12         0

Pero cuando se ejecuta el código anterior, aparece un error

[InvalidCastException: Specified cast is not valid.]
Deserialize3d3c9260-abcb-4964-97c1-4a4e66b786d3(IDataReader ) +354

[DataException: Error parsing column 2 (selected=0 - Int64)]
Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader) in     C:\Projects\Web\SqlMapper.cs:1685
Deserialize3d3c9260-abcb-4964-97c1-4a4e66b786d3(IDataReader ) +432
Dapper.<QueryInternal>d__13`1.MoveNext() in C:\Projects\Web\Source\SqlMapper.cs:608
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +327
System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\Projects\Web\Source\SqlMapper.cs:538

Voy a crear una propiedad de "Traducción" por el momento, pero ¿es este un caso de uso inusual?

Respuesta aceptada

No estoy seguro de si esta es la mejor manera de hacerlo, pero debería ser el truco:

SELECT T1.id, CAST(CASE WHEN T2.id IS NULL THEN 0 ELSE 1 END AS BIT) AS selected
FROM ...

(Para ser sincero, no estoy convencido de que tu T2.id IS NOT NULL AS selected cláusula T2.id IS NOT NULL AS selected es T-SQL legal en primer lugar, pero si dices que está funcionando, ¡tomaré tu palabra!).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué