fetch 总是返回一个List<T>
事实是Fetch<T>()
方法返回一个List<T>
意味着在您的代码示例中它返回
List<Dictionary<int, int>> result = ...
这可能不是您想要的,并且每个字典只包含一个项目,这击败了您首先想要拥有一本字典的全部原因。据我了解你的问题,你实际上想得到:
Dictionary<int, int> result = ...
当然还有扩展方法List<T>
可以让您将其转换为其他类型。一种这样的方法是.ToDictionary()
它可以将您的结果转换为您想要获得的字典。
第一个想法
现在我们手头的问题是我们可以使用什么类型 with Fetch
方法?最初我想到了两件事:
KeyValuePair<int, int>
Tuple<int, int>
即使想法很好,但没有一个可行,因为Key
财产在KeyValuePair
没有公共 setter,第二个没有 PetaPoco 可以使用的无参数构造函数。
Solution
我们在这里留下的是创建一个类似于的自定义类型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()
扩展方法。