以下功能迭代时间较长,需要优化代码以提高获取数据的性能。你能帮我如何优化吗?
private List<ApplicationMenuItemDTO> toDTO(List<ApplicationMenuItem> list)
{
if (list.Count() > 0)
{
ApplicationUser u = manager.FindById(User.Identity.GetUserId<int>());
List<ApplicationMenuItemDTO> miDTOs = new List<ApplicationMenuItemDTO>();
foreach(ApplicationMenuItem mi in list)
{
if (mi.PermissionId == null // menu items that do not require permission
|| u.HasPermission(mi.PermissionId)) // menu items user has permission to
{
miDTOs.Add(new ApplicationMenuItemDTO {
MenuItemId = mi.MenuItemId,
ParentMenuItemId = mi.ParentMenuItemId,
Name = mi.Name,
NamePlural = mi.NamePlural,
DisplayName = mi.DisplayName,
DisplayNamePlural = mi.DisplayNamePlural,
DeepLink = mi.DeepLink,
ApplicationPageId = mi.ApplicationPageId,
Description = mi.Description,
PermissionId = mi.PermissionId,
IsLocked = mi.IsLocked,
Url = mi.Url,
Rank = mi.Rank,
MenuItemTypeID = mi.MenuItemTypeID,
MenuItem = toDTO(db.ApplicationMenuItems.Where(x => x.ParentMenuItemId == mi.MenuItemId).ToList())
});
}
}
return miDTOs.OrderBy(x=>x.Rank).ToList();
}
else
{
//base case - return empty list
return new List<ApplicationMenuItemDTO>();
}
}
很难说,因为OP没有写出性能问题在哪里,但这里有一些猜测。
ApplicationUser u = manager.FindById(User.Identity.GetUserId<int>());
我无法判断这个查询是否昂贵,但另一方面,它似乎并不依赖于任何
mi
数据。因此,您可以将其移出 foreach
循环。
这行代码:
MenuItem = toDTO(db.ApplicationMenuItems
.Where(x => x.ParentMenuItemId == mi.MenuItemId)
.ToList())
看起来好像它在每个循环迭代中执行一次数据库查询。因此,如果
list
中有 50 个项目,那么您将执行 50 个数据库查询。
尝试研究是否可以将数据库查询移出循环,而改为进行单个批量查询。然后使用
list
压缩或连接该查询的结果。