C# 映射到PetaPoco中的集合?

C# 映射到PetaPoco中的集合?,c#,petapoco,C#,Petapoco,是否有办法将以下内容映射到词典?它似乎为尽可能多的返回结果生成行,但它们没有值 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 = dat

是否有办法将以下内容映射到
词典
?它似乎为尽可能多的返回结果生成行,但它们没有值

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);
Sql=newsql()
.Append(“选择计数(*)作为“回答计数”,问题ID”)
.Append(“来自CF.Answers”)
.Append(“其中SurveyId=@0”,SurveyId)
.Append(“按问题ID分组”);
var result=database.Fetch(sql);
Fetch始终返回一个
列表
Fetch()
方法返回一个
List
的事实意味着在您的代码示例中它返回

List<Dictionary<int, int>> result = ...
尽管想法不错,但没有一个可行,因为
KeyValuePair
中的
Key
属性没有公共setter,第二个属性也没有PetaPoco可以使用的无参数构造函数

解决方案 这里我们只剩下创建一个类似于
Tuple
的自定义类型,但其功能实际上可以与PetaPoco一起使用。让我们将此类型设置为泛型,以便可以轻松地将其与不同类型一起重用:

public class Pair<T1, T2>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
}
公共类对
{
公共T1项1{get;set;}
公共T2项2{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);
Sql=newsql()
.Append(“选择QuestionId作为项1,计数(*)作为项2”)
.Append(“来自答案”)
.Append(“其中SurveyId=@0”,SurveyId)
.Append(“按问题ID分组”);
var结果=数据库
.Fetch(sql)
.ToDictionary(i=>i.Item1,i=>i.Item2);

请注意,我已经颠倒了select字段的顺序(并将它们设置为不同的别名),因为您不希望计数是字典键(它们可能会重复),而是问题ID。因此,要么像我一样颠倒选择字段的顺序,要么为
.ToDictionary()
扩展方法提供正确的选择器。

我选择使用动态:

var result = database.Query<dynamic>(sql)
    .ToDictionary(d => d.QuestionId, d => d.AnswerCount);
var result=database.Query(sql)
.ToDictionary(d=>d.QuestionId,d=>d.AnswerCount);
几点注意:

  • 你需要从“回答计数”栏中删除空格,然后选择“回答计数”,这样才能起作用
  • 出于性能原因,我使用了
    Query
    而不是
    Fetch
    ;理论上,它应该首先跳过具体化到
    列表
    ,而是将结果直接流式传输到
    字典

我尝试实现您的解决方案,但Item1和Item2的值始终为0,因此出现了重复的键错误。我知道查询是正确的,字典的记录计数为3,但没有将值放入其中。我不知道为什么。谢谢!如果我更改Item1->QuestionId和Item2->Count的名称,它会起作用,但是这样做会破坏使用字典的目的。关于如何让它与Item1和Item2值一起工作,有什么想法吗?它似乎不想映射到它们,因为它与列名不匹配。@chobo:我能想到的唯一解释是,您保留了原始TSQL语句语法,没有列别名,也没有更改列顺序。。。如果设置了列别名,则不应从查询中获取
QuestionId
Count
,而是获取列
Item1
Item2
。尤其不是
Count
,因为我的答案没有使用这个别名,你原来的问题也没有。@chobo:当你说“如果我更改名称”时,我想你是在
Pair
类中谈论属性名称,对吗?哦。。。你在别名方面是对的,完全忽略了这一点:)我是个白痴。非常感谢你的帮助!
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);
var result = database.Query<dynamic>(sql)
    .ToDictionary(d => d.QuestionId, d => d.AnswerCount);