Я работаю над приложением ASP.NET MVC 4, в котором я пытаюсь создать панель мониторинга, которая читает из двух представлений базы данных;одно представление перечисляет здания с количеством и целями, а другое перечисляет этажи этих зданий с количеством и целями.Я пытаюсь объединить их на приборной панели, поэтому я создал модель данных с именем DashboardView
, которая содержит здания с этажами в свойстве Children
.
Локально работает достаточно хорошо, но при развертывании на рабочем сервере IIS он работает невероятно медленно, и я не уверен, что это связано с неэффективностью доступа к данным:
using (var db = new MyDBContext())
{
var views = (from building in db.BuildingViews.OrderBy(x => x.BuildingName) select new { building })
.AsEnumerable()
.Select(bldgView => new DashboardView
{
ViewType = "Building",
ViewLabel = bldgView.building.BuildingName,
CurrentCount = bldgView.building.Count,
GoalCount = bldgView.building.Goal,
Children = (from floors in db.FloorViews.Where(v => v.BuildingId == bldgView.Building.BuildingId) select new { floor })
.AsEnumerable()
.Select(floorView => new DashboardView
{
ViewType = "Floor",
ViewLabel = floorView.floor.FloorName
CurrentCount = floorView.floor.Count,
GoalCount = floorView.floor.Goal
}).ToList()
}).ToList();
double totalBldgCount = db.BuildingViews.Select(x => x.Count).Sum();
double totalGoalCount = db.BuildingViews.Select(x => x.Goal).Sum();
}
Есть ли лучший способ создать пакет данных, которого я пытаюсь достичь, или проблема, возможно, связана с одновременным попаданием нескольких пользователей в базу данных?
:: EDIT ::
Теперь я понимаю, что использование .AsEnumerable()
может быть причиной плохой производительности;однако я изо всех сил пытаюсь понять, как я могу правильно построить мои DashboardView
с дочерними DashboardView
объектами без него, поскольку это не работает:
var query = (from buildings in db.BuildingViews
join floors in db.FloorViews on buildings.BuildingId equals floors.BuildingId
select new DashboardSprinklerView
{
ViewType = "Building",
ViewLabel = building.BuildingName,
CurrentCount = building.Count,
GoalCount = building.Goal,
Children = (floor from floors select new DashboardSprinklerView
{
....
}).ToList()
}).ToList();