public List<KeyValuePair<decimal, string>> getDepartments()
{
using (DBEntities db = new DBEntities ())
{
var dept = (from i in db.Departments
orderby i.DepartmentName
select new
{
i.Id,
i.DepartmentName
}).ToDictionary(Key => Key.Id, Value => Value.DepartmentName);
return dept.ToList<KeyValuePair<decimal, string>>();
}
}
在上面的功能中,我需要一个List<KeyValuePair<decimal, string>>
。所以我首先将IQueryable转换为Dictionary .ToDictionary(Key => Key.Id, Value => Value.DepartmentName)
,然后使用.ToList<KeyValuePair<decimal, string>>();
转换为List。
但它似乎很贵。我该如何减少它?如何避免使用过多的转换(如ToDictionary,ToList)?
更新1:
这是其他人的代码,在确认Chrome中的响应数据后,我想到了为什么.ToList
存在。使用.ToList
时,响应数据看起来像0: {Key:13, Value:Marketing} 1: {Key:5, Value:Research}
,填充下拉列表并且是angularjs友好的。当我删除它并将其作为Dictionary
返回时,响应数据看起来像{"13":"Marketing","5":"Research"}
,无法填充下拉列表。所以我无法移除.ToList
。我有没有办法List<KeyValuePair<decimal, string>>
IQueryable
而不使用ToDictionary
?
答案 0 :(得分:4)
只有第一个调用(iqueryable上的todictionary)才会很昂贵(数据库调用),第二个调用是在内存中完成的,除非你正在处理一个庞大的数据集,否则它将会非常免费。
但是我想不出任何理由“为什么”你想要从字典转换为keyvaluepairs列表,因为字典已经是这些keyvaluepairs的无数。
所以不,它不贵,但你可能更好地重新编写消费代码并返回字典。
在评论后更新:试试这个,看看它是否显示了你想要的json:
public IEnumerable<KeyValuePair<decimal, string>> getDepartments()
{
using (DBEntities db = new DBEntities ())
{
var dept = (from i in db.Departments
orderby i.DepartmentName
select new
{
i.Id,
i.DepartmentName
}).ToDictionary(Key => Key.Id, Value => Value.DepartmentName);
foreach(var item in dept)
yield return item;
}
}