2011-12-02 6 views
10

mam tej klasy ...Jak uzyskać elegancki mapować int do logicznej własności

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

    public bool Selected { get; set; } 
} 

a następnie użyć elegancki próbować utworzyć listę jak to ...

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

która zwraca zestaw wyników tak ....

id selected 
9   0 
10   1 
11   1 
12   0 

Ale gdy powyższy kod jest wykonywany, pojawia się błąd

[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 

Mam zamiar teraz utworzyć właściwość "Tłumaczenie", ale czy jest to nietypowy przypadek użycia?

+1

Jak wyglądają Twoje stoły i z jaką wersją systemu operacyjnego korzystasz? Przetestowałem powyższy kod w moim systemie i mogłem odwzorować wartość int na wartość logiczną bez problemów z używaniem dappera. – Alex

Odpowiedz

13

Nie jestem pewien, czy jest to najlepszy sposób to zrobić, ale powinien to zrobić lewy:

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

(Szczerze mówiąc, nie jestem przekonany, że klauzula T2.id IS NOT NULL AS selected T prawny -SQL w pierwszej kolejności, ale jeśli powiesz, że działa, to wezmę na to twoje słowo!)

Powiązane problemy