8

以下をにマッピングする方法はありDictionary<int,int>ますか?返された結果と同じ数の行が生成されるようですが、値がありません...

Sql sql = new Sql()
    .Append("SELECT Count(*) as 'Answer Count', QuestionId")
    .Append("FROM CF.Answers")
    .Append("WHERE SurveyId = @0", surveyId)
    .Append("GROUP BY QuestionId");

var result = database.Fetch<Dictionary<int,int>>(sql);
4

2 に答える 2

15

フェッチは常に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()つまり、私が行ったように選択フィールドの順序を逆にするか、拡張メソッドに正しいセレクターを提供するかのどちらかです。

于 2012-11-30T13:20:45.090 に答える
1

私はダイナミックを使用することを選びます:

var result = database.Query<dynamic>(sql)
    .ToDictionary(d => d.QuestionId, d => d.AnswerCount);

いくつかのメモ:

  • これを機能させるには、「AnswerCount」列からスペースを削除して「AnswerCount」を選択する必要があります。
  • パフォーマンス上の理由からQuery代わりに使用しました。Fetch理論的には、最初のマテリアライズをスキップしList、代わりに結果を直接にストリーミングする必要がありDictionaryます。
于 2014-03-09T22:05:32.510 に答える