¿Cómo puedo hacerme más elegante para mapear un int a una propiedad booleana?

StackOverflow https://stackoverflow.com/questions/8356048

  •  27-10-2019
  •  | 
  •  

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 ahora, pero ¿es este un caso de uso inusual?

¿Fue útil?

Solución

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top