Question

I have this class...

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

    public bool Selected { get; set; }
}

and then use dapper to attempt to create a list like this...

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

which returns a result set like this....

id  selected
 9         0
10         1
11         1
12         0

But when code above is executed, i get an 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

I'm going to create a "Translating" property for now, but is this an unusual use case?

Was it helpful?

Solution

I'm not sure if this is the best way to do it, but it should do the trick:

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

(To be honest, I'm not convinced that your T2.id IS NOT NULL AS selected clause is legal T-SQL in the first place, but if you say that it's working then I'll take your word for it!)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top