映射到PetaPoco的收藏?

时间:2012-11-30 00:55:17

标签: c# petapoco

有没有办法将以下内容映射到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);

2 个答案:

答案 0 :(得分:15)

提取始终返回List<T>

Fetch<T>()方法返回List<T>这一事实意味着在您的代码示例中返回

List<Dictionary<int, int>> result = ...

这可能不是你想要的,每个字典只会举行一个项目,这就击败了你想要首先拥有字典的全部原因。据我了解你的问题,你真的想得到:

Dictionary<int, int> result = ...

List<T>当然有一些扩展方法可以让您将其转换为其他类型。一种这样的方法是.ToDictionary(),它可以将您的结果转换为您想要获得的字典。

第一个想法

现在我们手头的问题是我们可以使用哪种类型Fetch方法?最初我想到了两件事:

KeyValuePair<int, int>
Tuple<int, int>

即使很好的想法,它们都不会起作用,因为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()扩展方法提供正确的选择器。

答案 1 :(得分:1)

我选择使用动态:

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

一对夫妇注意到:

  • 您需要从“回答计数”列中删除空格,然后选择“AnswerCount”才能使其生效。
  • 出于性能原因,我使用Query代替Fetch;从理论上讲,它应首先跳过实现List而不是直接将结果流式传输到Dictionary