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?
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!)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With