C# 如何在c linq中为对象内部的对象创建where条件?

C# 如何在c linq中为对象内部的对象创建where条件?,c#,linq,lambda,C#,Linq,Lambda,假设我有一门课,比如: 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

假设我有一门课,比如:

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; }
  }
我可以这样写,以便检索IsDeleted=false的培训计划,还可以检索附加到它的培训对象

var result = _trainingPlanRepository.FindBy(t => t.ProjectId == projectId && t.IsDeleted == false).ToList();
但是我如何为IsDeleted=false的训练对象设置条件呢?

您可以使用下面的任何类似方法。假设您的t有一个列表,您也希望查询该列表以获取未删除的列表

var result = _trainingPlanRepository.
             Where(t => t.ProjectId == projectId && !t.IsDeleted &&
             t.TrainingList.Any(x => !x.IsDeleted)).ToList();
你可以用下面的任何一种。假设您的t有一个列表,您也希望查询该列表以获取未删除的列表

var result = _trainingPlanRepository.
             Where(t => t.ProjectId == projectId && !t.IsDeleted &&
             t.TrainingList.Any(x => !x.IsDeleted)).ToList();
现在,在trainingPlans变量中,所有相关的培训对象都存在于该变量中,因此我们希望根据IsDelted属性对其进行筛选。因此,您可以使用以下代码:

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

现在,在trainingPlans变量中,所有相关的培训对象都存在于该变量中,因此我们希望根据IsDelted属性对其进行筛选。因此,您可以使用以下代码:

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

祝你好运。

我想在培训计划和培训之间有一种一对多的关系,可能是多对多的关系:每个培训计划都有零个或多个培训,并且每个培训都只属于一个培训计划,即外键培训ID或类似的内容所指的培训

因此,在存储库的深处,您将有两个IQueryable序列:

IQueryable<Training> trainings = ...
IQueryable<TrainingPlan> trainingPlans = ...
另一种方法是在GroupJoin之前删除未删除的培训:

var validTrainingPlans = trainingPlans.Where(...);
var validTrainings = trainings.Where(training => !training.IsDeleted);
var result = validTrainingPlans.GroupJoin(validTrainings,
    ... etc

我猜培训计划和培训之间存在一对多的关系,可能是多对多的关系:每个培训计划都有零个或多个培训,并且每个培训都只属于一个培训计划,即外键培训ID或类似内容所指的培训

因此,在存储库的深处,您将有两个IQueryable序列:

IQueryable<Training> trainings = ...
IQueryable<TrainingPlan> trainingPlans = ...
另一种方法是在GroupJoin之前删除未删除的培训:

var validTrainingPlans = trainingPlans.Where(...);
var validTrainings = trainings.Where(training => !training.IsDeleted);
var result = validTrainingPlans.GroupJoin(validTrainings,
    ... etc

Linq是一个查询,设置值需要一个单独的语句。OP希望检索子列表中的项目,其中!IsDeleted而不是TrainingViewModel添加Training Model对于问题OP说:但是我如何为IsDeleted=false的训练对象设置条件呢?是的,for循环解决方案是我目前使用的,只是为了完成模块,但是如果我不需要for循环来进行查询,那就太好了。我想也许有一种方法可以通过linqLinq实现,因为查询和设置值需要一个单独的语句。OP希望检索子列表中的项目,其中!IsDeleted而不是TrainingViewModel添加Training Model对于问题OP说:但是我如何为IsDeleted=false的训练对象设置条件呢?是的,for循环解决方案是我目前使用的,只是为了完成模块,但是如果我不需要for循环来进行查询,那就太好了。我想也许有一种方法可以通过linqAny不过滤数据来实现。它只是确定序列是否包含元素。这意味着基于某些条件的查询结果可以返回一个TrainingObject,该对象的IsDelted=false。所以你的问题不是这个问题的答案question@HamedMoghadasi为什么不试一下,看看它是否有效我知道它有效,但很明显它可能包含错误的数据。任何人都没有过滤数据。它只是确定序列是否包含元素。这意味着基于某些条件的查询结果可以返回一个TrainingObject,该对象的IsDelted=false。所以你的问题不是这个问题的答案question@HamedMoghadasi为什么不试一下,看看它是否有效我知道它有效,但很明显它可能包含错误的数据。