У меня есть модель Project
с коллекцией AppUsers
, присвоенной ProjectManagers
или более общим случаем Users
public class Project
{
public int ProjectID { get; set; }
[Required(ErrorMessage = " Please enter a project name")]
public string Name { get; set; }
public virtual ICollection<AppUser> ProjectManagers { get; set; }
public virtual ICollection<AppUser> Users { get; set; }
}
В моем контроллере я пытаюсь сгенерироватьсписок всех проектов, которым назначен конкретный AppUser
, независимо от того, находятся ли они в коллекции ProjectManagers
или Users
projectList = repository.Projects.Where(p => p.ProjectManagers.Contains(user) || p.Users.Contains(user));
Однако, если AppUser
связан с более чемодин Project
только последний Project
заполняет этот список.Как убедиться, что все связанные проекты возвращены?
Моя AppUser
модель:
public class AppUser : IdentityUser
{
//literally does nothing at this point and
// is merely a placeholder until I add more
}
В моем контроллере я использую метод действия List
, чтобы отобразить все связанные Projects
до AppUser
.Эта часть работает неправильно, она возвращает только один Project
public async Task<IActionResult> List(int page = 1)
{
var user = await userManager.FindByNameAsync(User.Identity.Name);
if(user != null)
{
IQueryable<Project> projectList = GetUserProjects(page, user);
var model = GetProjectsListViewModel(projectList, page, user);
return View(model);
}
TempData["message"] = "User not found";
return RedirectToAction("Index", "Home");
}
Следующие методы используются для генерации списков и моделей для разбивки на страницы
public ProjectsListViewModel GetProjectsListViewModel (IQueryable<Project> projectList, int page, AppUser user)
{
ProjectsListViewModel model = new ProjectsListViewModel();
model.Projects = projectList
.OrderBy(p => p.ProjectID)
.Skip((page - 1) * PageSize)
.Take(PageSize);
model.PagingInfo = new PagingInfo
{
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = projectList.Count()
};
return model;
}
public IQueryable<Project> GetUserProjects(int page, AppUser user)
{
IQueryable<Project> projectList;
//IQueryable<Project> result;
if (user.UserName == "Admin")
{
projectList = repository.Projects;
}
else
{
projectList = repository.Projects
.Where(p => p.ProjectManagers.Any(pm => pm.Id == user.Id) || p.Users.Any(u => u.Id == user.Id))
.Select(x => new { UserId = user.Id, Projects = x })
.GroupBy(p => p.UserId)
.Select(x => x.OrderByDescending(p => p.Projects.ProjectID).First().Projects);
//None of the commented out code works either
//projectList = repository.Projects.Where(p => p.ProjectManagers.Contains(user) || p.Users.Contains(user) || p.CommissioningAuthorities.Contains(user));
//foreach (Project p in repository.Projects)
//{
// if(p.ProjectManagers.Contains(user) || p.Users.Contains(user) || p.CommissioningAuthorities.Contains(user))
// {
// projectList.ToList().Add(p);
// }
//}
}
return projectList;
}
РЕДАКТИРОВАТЬ Я заметил, что когда я запускаю proj.ProjectManagers.Add(appUser);
, он добавляет этого пользователя как ProjectManager
, но, похоже, он также удаляет их из коллекции ProjectManager
любогодругой проект им был ранее присвоен