Я полагаю, что существует отношение один-ко-многим (возможно, многие-ко-многим) между TrainingPlan и Training: каждый TrainingPlan имеет ноль или более Tranings, и каждый Training принадлежит ровно одному TrainingPlan, а именно Training, который иностранный ключевой TrainingId (или что-то подобное) относится к.
Таким образом, где-то глубоко в вашем хранилище, у вас будет две последовательности IQueryable:
IQueryable<Training> trainings = ...
IQueryable<TrainingPlan> trainingPlans = ...
Вы хотите запросить все планы обучения, которые не были удалены и имеют ProjectId, равный projectId, вместе со всеми его не удаленными TrainingPlans.
Используя синтаксис метода, это довольно просто:
var result = trainingPlans
// keep only the training plans you want to keep:
.Where(trainingPlan => trainingPlan.ProjectId == projectId && !trainingPlan.IsDeleted)
// GroupJoin each trainingPlan with its trainings:
.GroupJoin(trainings,
trainingPlan => trainingPlan.Id, // from each training plan take the Id
training => training.TrainingPlanId, // from each training take the foreign key
(trainingPlan, matchingTrainings) => new // take the training plan with all its matching trainings
{ // to make a new
// Select the trainingplan properties you plan to use
Id = trainingPlan.Id,
Name = trainingPlan.Name,
...
// Keep only the non-deleted trainings
Trainings = matchingTrainings.Where(training => !training.IsDeleted)
.Select(training => new
{
// Select only the training properties that you plan to use:
Id = training.Id,
Date = training.Date,
...
// not needed, you know the value:
// TrainingPlanId = training.TrainingPlanId,
})
.ToList(),
});
Другим методом будет удаление не удаленных Тренировки перед ГруппойПрисоединение:
var validTrainingPlans = trainingPlans.Where(...);
var validTrainings = trainings.Where(training => !training.IsDeleted);
var result = validTrainingPlans.GroupJoin(validTrainings,
... etc