简化LINQ

时间:2014-06-04 03:50:46

标签: c# linq

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

1 个答案:

答案 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;
    }
}