ef核心linq过滤子实体

我有一个linq查询的问题。 我有3个实体:用户,目标和结果。 每个用户可以有多个(或没有)目标,每个目标可以有多个(或没有)结果我想要一个返回所有用户的查询,包括可能的目标和可能的结果。 这很有效。 但现在我想要包含filter来过滤目标和结果。 这样查询只返回符合这些条件的用户,目标和结果。

public class User { public ICollection Targets {get;set;} public string otherProperty {get;set;} } public class Target { public ICollection Results {get;set;} public User user {get;set;} public string Language {get;set;} } public class Result { public Target Target {get;set;} public int score {get;set;} } 

任何可以帮助我的EF核心linq专家?

亲切的问候,罗布雷希特

编辑1

 var query = from auditUser in _auditUserRepository.GetAll().Include(u => u.user) .WhereIf(!input.Group.IsNullOrWhiteSpace(), u => u.Group == input.Group) .WhereIf(!input.Filter.IsNullOrWhiteSpace(), u => u.user.FullName.ToLower().Contains(input.Filter.ToLower())) select auditUser; var results = query .Include(u => u.Targets) .ThenInclude(t => t.AuditResults) .PageBy(input) .ToListAsync(); await query .SelectMany(u => u.Targets) .WhereIf(!input.Language.IsNullOrWhiteSpace(), t => t.Target == input.Language) .SelectMany(t => t.AuditResults) .WhereIf(input.From != null, r => r.CompletionDate >= input.From) .WhereIf(input.To != null, r => r.CompletionDate <= input.From) .LoadAsync(); 

这就是我所拥有的,但它有两个问题:

  1. 如果没有a的结果,则不包括目标。 它似乎包含或者包含创建内部联接而不是左联接。
  2. 这不会过滤语言或日期。

我建议您使用所需的属性创建一个ViewModel类。 例:

 public class UserViewModel { [Display(Name = "Other")] public string otherProperty {get; set;} [Display(Name = "Possible Targets")] public List targets {get; set;} [Display(Name = "Possible Results")] public List results{get; set;} } 

然后在“repository”类中,您可以创建一个过滤结果的方法。

 public List GetUserViewModelBy(int scoreFilter, string filter1= "", string filter2) { IQueryable query = _context.Results.Where(i => i.score==scoreFilter)).Include(x => x.Target) .Include(x => x.Target.Results.ToList()) .Include(x => x.User) .Include(x=>x.User.Targets.Where(i=>i.Language.ToLower().Contains(filter1)).ToList()); if (!string.IsNullOrEmpty(filter2)) { query = query.Where(x => x.Target.Language.ToLower().Contains(filter2)); } return query.Select(x => new UserViewModel() { otherProperty = x.User.otherProperty, targets = x.User.targets, results = x.Results }).ToList(); }