フェッチは常にList<T>
Fetch<T>()
メソッドがaを返すという事実List<T>
は、コード例ではそれが返すことを意味します
List<Dictionary<int, int>> result = ...
これはおそらくあなたが望むものではなく、各辞書はあなたが最初に辞書を持ちたい理由全体を打ち負かす1つのアイテムだけを保持するでしょう。私はあなたの質問を理解しているので、あなたは実際に取得したいです:
Dictionary<int, int> result = ...
List<T>
もちろん、他のタイプに1つとして変換できる拡張メソッドがあります。そのような方法の1つは.ToDictionary()
、結果を取得したい辞書に変換できる方法です。
最初のアイデア
ここで私たちが抱えている問題は、メソッドでどのタイプを使用できるかということです。Fetch
最初に2つのことが頭に浮かびました。
KeyValuePair<int, int>
Tuple<int, int>
素晴らしいアイデアですが、プロパティにはパブリックセッターがなく、2番目のKey
プロパティにKeyValuePair
はPetaPocoが使用できるパラメーターなしのコンストラクターがないため、いずれも機能しません。
解決
ここTuple
で省略しているのは、PetaPocoで実際に使用できる機能を備えた、と同様のカスタムタイプを作成することです。この型をジェネリックにして、さまざまな型で簡単に再利用できるようにしましょう。
public class Pair<T1, T2>
{
public T1 Item1 { get; set; }
public T2 Item2 { get; set; }
}
このカスタムクラスを使用すると、辞書を簡単に取得できるようになります。
Sql sql = new Sql()
.Append("SELECT QuestionId as Item1, COUNT(*) as Item2")
.Append("FROM Answers")
.Append("WHERE SurveyId = @0", surveyId)
.Append("GROUP BY QuestionId");
var result = database
.Fetch<Pair<int,int>>(sql)
.ToDictionary(i => i.Item1, i => i.Item2);
カウントを辞書キー(繰り返しになる可能性があるため)ではなく質問IDにするため、選択フィールドの順序を逆にした(そして異なるエイリアス名を設定した)という事実に注意してください。.ToDictionary()
つまり、私が行ったように選択フィールドの順序を逆にするか、拡張メソッドに正しいセレクターを提供するかのどちらかです。