Как создать условие where для объекта внутри объекта в c# linq? - PullRequest
0 голосов
/ 24 февраля 2020

Допустим, у меня есть класс вроде:

public class TrainingPlan
{      
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public string TrainingPlanName { get; set; }
    public List<Training> TrainingList { get; set; }
    public bool IsDeleted { get; set; }
  }

И объект обучения внутри него:

public class TrainingViewModel : AuditViewModel
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public int TrainingPlanId { get; set; }
    public bool IsDeleted { get; set; }
    public ProjectViewModel ProjectObject { get; set; }
    public TrainingPlanViewModel TrainingPlanObject { get; set; }
}

Я мог бы написать что-то вроде этого, чтобы получить TrainingPlans, где IsDeleted = false, а также получить прикрепленный к нему Training Objects.

var result = _trainingPlanRepository.FindBy(t => t.ProjectId == projectId && t.IsDeleted == false).ToList();

Но как мне установить условие для объектов Обучения, где IsDeleted = false также?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2020

Вы можете использовать Any(), как показано ниже. Предположение У вашего t есть List<Training>, который вы также хотите запросить, чтобы получить не удаленные.

var result = _trainingPlanRepository.
             Where(t => t.ProjectId == projectId && !t.IsDeleted &&
             t.TrainingList.Any(x => !x.IsDeleted)).ToList();
2 голосов
/ 24 февраля 2020
var trainingPlans = _trainingPlanRepository
                    .Where(t => t.ProjectId == projectId && t.IsDeleted == false)
                    .ToList();

Теперь, в переменной trainingPlans, в ней существуют все связанные training объекты, поэтому мы хотим отфильтровать ее по IsDelted свойству. поэтому вы можете использовать следующий код:

foreach (var item in trainingPlans)
{
   item.trainingList = item.trainingList.Where(t => !t.IsDelete).ToList();
}

удачи.

0 голосов
/ 26 февраля 2020

Я полагаю, что существует отношение один-ко-многим (возможно, многие-ко-многим) между 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...