Ich habe den folgenden Code:
string sql = "SELECT * FROM orders o " +
"INNER JOIN users u ON o.user_id = u.id " +
"WHERE o.ticker = @ticker AND o.user_id = @user_id";
var _orders = connection.Query(sql, new { ticker = ticker, user_id = userId });
IEnumerable<Order> orders = connection.Query<Order, User, Order>(sql,
(o, u) =>
{
u.Id = u.Id.Trim();
Order order = new Order(o.Ticker.Trim(), u, o.Type, o.Quantity, o.Price, o.IsMarketOrder, o.ExpirationDate, o.FillCompletely, o.FillImmediately);
return order;
},
new { ticker = ticker, user_id = userId }
);
return orders.ToArray<Order>();
Die beiden "connection.Query" führen dieselbe SQL aus. Der Unterschied besteht darin, dass der erste eine Liste von DapperRows zurückgibt, während der zweite eine generische Abfrage <> ist, die multi automatisch die Entität abbildet.
Nun, in der ersten .Query () (die eine Liste von DapperRows zurückgibt) sind die booleschen Eigenschaften (Bit in dB) "FillImmediately" und "FillCompletely" in der Klasse wahr oder falsch, abhängig davon, ob sie "1" oder "0" sind "in der DB. Das funktioniert also gut.
Bei Verwendung von .Query <> () sind beide Eigenschaften jedoch immer "false". Es scheint, dass die .Query <> () das Bit nicht ordnungsgemäß auf Boolean zuordnen kann.
Ich benutze die neueste Version von Dapper ab heute (1.42) und SQL Server 2008
Gedanken?
Dies scheint ein Bug von Multi-Mapping zu Dapper zu sein. Versuchen Sie, die IDs nach allen anderen Spalten, die Sie zuordnen möchten, am Ende von select zu setzen. Beispielsweise:
SELECT o.Status, u.Name, u.FillCompletely, u.FillImmediately, -- the trick ids in the end -> u.user_id, o.order_id FROM orders o INNER JOIN users u ON o.user_id = u.id WHERE o.ticker = @ticker AND o.user_id = @user_id