ちょっと必要があったのでメモ。
Querydynamic()>が返すdynamicの実体はDapper.SqlMapper.DapperRowのコレクション
Query<dynamic()>()が返すdynamicの実体はDapper.SqlMapper.DapperRow
のコレクションです。
このDapperRowはDapperのDapper.SqlMapperのprivateな型ですが、以下の通りIDictionary<string, object>
の実装です。
ということで素直にIDictionary<string, object>にキャストしてみます。
// SQLは実際にはSELECT * とか結果セット戻すストアドとか var result = cn.Query("SELECT 1 AS Id, 'Taro' AS Name , 20 AS Age"); var fieldList = ((IDictionary<string, object>)result.First()) .Select(x => x.Key) .ToList();
こんな感じで取れました。
どこでつかうん?
『どこでそんなもの使うの?』とか思う向きもかもしれないですが、クエリが返すフィールド名をハードコーディングしたくないケースって意外とあるというか、まあそんな感じで。 (例えばプログラム部分が『土管』に徹する場合(DB→JSONtとかDB→Excelとか)等だと、両端の柔軟性を生かす事ができると思います。というか、今回やりたいケースがまさにそれでした。)