using System; using System.Collections.Generic; using System.Linq; using System.Web; using EnVisage.Models; using System.Data.Entity; namespace EnVisage.Code.BLL { public class ViewManager : ManagerBase { public ViewManager(EnVisageEntities dbContext) : base(dbContext) { } public override View Save(ViewModel model) { View view = null; if (Guid.Empty.Equals(model.Id)) { view = base.Save(model); if (model.CompanyId != null) { foreach (var companyId in model.CompanyId) { var company2View = DbContext.Company2View.Create(); company2View.Id = Guid.NewGuid(); company2View.ViewId = view.Id; company2View.CompanyId = companyId; DbContext.Company2View.Add(company2View); } } if (model.UserId != null) { foreach (var userId in model.UserId) { var user2View = DbContext.User2View.Create(); user2View.Id = Guid.NewGuid(); user2View.ViewId = view.Id; user2View.UserId = userId; DbContext.User2View.Add(user2View); } } if (model.CostCenterId != null) { foreach (var costCenterId in model.CostCenterId) { var view2CostCenter = DbContext.View2CostCenter.Create(); view2CostCenter.Id = Guid.NewGuid(); view2CostCenter.ViewId = view.Id; view2CostCenter.CostCenterId = costCenterId; DbContext.View2CostCenter.Add(view2CostCenter); } } if (model.TeamId != null) { foreach (var teamId in model.TeamId) { var team2View = DbContext.Team2View.Create(); team2View.Id = Guid.NewGuid(); team2View.ViewId = view.Id; team2View.TeamId = teamId; DbContext.Team2View.Add(team2View); } } } else { view = base.Save(model); var companies = DbContext.Company2View.Where(x => x.ViewId == model.Id).ToList(); companies.Where(x => model.CompanyId == null || !model.CompanyId.Contains(x.CompanyId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.CompanyId != null) { foreach (var companyId in model.CompanyId.Where(c => !companies.Select(x => x.CompanyId).Contains(c))) { var company2View = DbContext.Company2View.Create(); company2View.Id = Guid.NewGuid(); company2View.ViewId = view.Id; company2View.CompanyId = companyId; DbContext.Company2View.Add(company2View); } } var users = DbContext.User2View.Where(x => x.ViewId == model.Id).ToList(); users.Where(x => model.UserId == null || !model.UserId.Contains(x.UserId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.UserId != null) { foreach (var userId in model.UserId.Where(c => !users.Select(x => x.UserId).Contains(c))) { var user2View = DbContext.User2View.Create(); user2View.Id = Guid.NewGuid(); user2View.ViewId = view.Id; user2View.UserId = userId; DbContext.Entry(user2View).State = EntityState.Added; } } var costcenters = DbContext.View2CostCenter.Where(x => x.ViewId == model.Id).ToList(); costcenters.Where(x => model.CostCenterId == null || !model.CostCenterId.Contains(x.CostCenterId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.CostCenterId != null) { foreach (var costCenterId in model.CostCenterId) { var view2CostCenter = DbContext.View2CostCenter.Create(); view2CostCenter.Id = Guid.NewGuid(); view2CostCenter.ViewId = view.Id; view2CostCenter.CostCenterId = costCenterId; DbContext.View2CostCenter.Add(view2CostCenter); } } var team2Views = DbContext.Team2View.Where(x => x.ViewId == view.Id).ToList(); team2Views.Where(x => model.TeamId == null || !model.TeamId.Contains(x.TeamId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.TeamId != null) { foreach (var teamId in model.TeamId.Where(c => !team2Views.Select(x => x.TeamId).Contains(c))) { var team2View = DbContext.Team2View.Create(); team2View.Id = Guid.NewGuid(); team2View.ViewId = view.Id; team2View.TeamId = teamId; DbContext.Entry(team2View).State = EntityState.Added; } } } return view; } public ViewModel LoadWithChildCollections(Guid? value, bool isReadOnly = true) { ViewModel result = (ViewModel)base.Load(value, isReadOnly); if (value.HasValue) { var companies = DbContext.Company2View.Where(x => x.ViewId == value.Value).ToList(); result.CompanyId = companies.Select(x => x.CompanyId).ToList(); result.Company = companies.Select(x => x.Company.Name).ToList(); var users = DbContext.User2View.Where(x => x.ViewId == value.Value).ToList(); result.UserId = users.Select(x => x.UserId).ToList(); var costcenters = DbContext.View2CostCenter.Where(x => x.ViewId == value.Value).ToList(); result.CostCenterId = costcenters.Select(x => x.CostCenterId).ToList(); var teams = DbContext.Team2View.Where(t => t.ViewId == value.Value).ToList(); result.TeamId = teams.Select(t => t.TeamId).ToList(); } return result; } protected override View InitInstance() { return new View { Id = Guid.NewGuid() }; } protected override View RetrieveReadOnlyById(Guid key) { return DataTable.AsNoTracking().FirstOrDefault(t=>t.Id == key); } public override System.Data.Entity.DbSet DataTable { get { return DbContext.Views; } } public IList GetViewsByOwner(Guid? ownerId) { if (ownerId.HasValue) { return DataTable.Where(t => t.User2View.Select(x => x.UserId).Contains(ownerId.Value)).AsNoTracking().ToList(); } return new List(); } public IList GetTeams(Guid? viewId) { if (!viewId.HasValue || Guid.Empty.Equals(viewId)) return new List(); var teams = (from tv in DbContext.Team2View join t in DbContext.Teams on tv.TeamId equals t.Id where tv.ViewId == viewId orderby t.Name select t).AsNoTracking().ToList(); teams.ForEach(t => t.PeopleResources = t.PeopleResources.OrderBy(r=>r.LastName).ToList()); return teams; } } }