1

次のコードがあります。

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

2 つの「connection.Query」は同じ SQL を実行します。違いは、最初のものは DapperRows のリストを返すのに対し、2 番目のものはエンティティを自動的にマルチ マップする汎用 Query<> であることです。

ここで、最初の .Query() (DapperRows のリストを返す) で、ブール プロパティ (dB のビット) の「FillImmediately」と「FillCompletely」は、「1」か「0」かによって、クラスで true または false になります。 "DBで。それでうまくいきます。

ただし、.Query<>() を使用する場合、両方のプロパティは常に「false」です。.Query<>() はビットをブール値に適切にマップできないようです。

今日(1.42)の最新バージョンのDapperとSQL Server 2008を使用しています

考え?

4

1 に答える 1

2

これは dapper へのマルチマッピングのバグのようです。マップする他のすべての列の後、select の最後に ID を配置してみてください。例えば:

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
于 2016-03-21T13:55:41.920 に答える