Simplifying LINQ

本文关键字:LINQ Simplifying | 更新日期: 2023-09-27 18:06:28

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转换为字典.ToDictionary(Key => Key.Id, Value => Value.DepartmentName),然后使用.ToList<KeyValuePair<decimal, string>>();转换为列表。

但是它似乎很贵。我如何减少它?我如何避免使用太多的转换(如ToDictionary, ToList)?

更新1:

这是别人的代码,只是想知道为什么.ToList在Chrome中检查响应数据后存在。当使用.ToList时,响应数据将看起来像0: {Key:13, Value:Marketing} 1: {Key:5, Value:Research},它填充一个下拉框,并且对angularjs友好。当我删除它并将其作为Dictionary返回时,响应数据将看起来像{"13":"Marketing","5":"Research"},无法填充下拉框。所以我不能删除.ToList。有没有一种方法,我可以得到List<KeyValuePair<decimal, string>>IQueryable不使用ToDictionary ?

Simplifying LINQ

只有第一次调用(todictionary on iqueryable)将是昂贵的(数据库调用),第二次是在内存中完成的,除非你在一个巨大的数据集上工作,它将几乎是免费的。

然而,我想不出任何理由"为什么"你想要从字典转换为键值对列表,因为字典已经是这些键值对的不可枚举的。

所以不,这并不昂贵,但你可能会更好地重新编写消费代码,只返回字典。

在你的评论后更新:试试这个,看看它是否显示你想要的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;
    }
}