Я использую проекцию для заполнения ViewModels данными.
В этом случае я работаю с проектами и задачами.
У меня есть форма, которая позволяет пользователю выбрать проект и НЕОБЯЗАТЕЛЬНО выбрать человека, которому могут быть назначены задачи в рамках проекта.
В моем Project ViewModel у меня есть эта ViewModel для задач:
public IEnumerable<TaskVM> TaskVM { get; set; }
Я фильтрую запрос следующим образом:
var query = db.Projects.AsQueryable();
if (filterProjectId)
{
query = query.Where(p => p.ProjectId == ProjectId);
}
if (filterAssignedTo)
{
query = query.Where(p => p.Tasks.Any(t => t.AssignedTo == "John"));
}
Вопрос: Вышеприведенное вернет все проекты, у которых есть какие-либо задачи, назначенные Джону, но также вернет задачи, назначенные Фреду. У меня такой вопрос: как я могу получить все проекты, но ТОЛЬКО задачи, назначенные Джону?
Я знаю, что могу сделать это:
var resultList = query.Select(p => new ProjectVM
{
ProjectId = p.ProjectId,
ProjectName = p.ProjectName,
TaskVM = p.Tasks.Where(t => t.AssignedTo == "John").OrderByDescending(t => t.TaskName).Select(t => new TaskVM
{
TaskId = t.TaskId,
TaskName = t.TaskName,
AssignedTo = t.AssignedTo
})
});
Но я не знаю, нужно ли мне фильтровать Джона. Пользователь может захотеть ВСЕ проекты с идентификатором проекта.
Итак, еще раз, как я могу получить все проекты, но ТОЛЬКО задачи, назначенные Джону?
Спасибо!