有没有办法将以下内容映射到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);
最佳答案
提取始终返回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
属性没有公共(public)设置程序,第二个属性没有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()
扩展方法提供正确的选择器。关于c# - 映射到PetaPoco中的收藏集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13637459/