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
,而是将结果直接流式传输到列表
字典
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);