2017-08-25 69 views
0

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

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专家,可以帮助我吗?

亲切的问候, Robrecht

编辑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(); 

这是我有这样的,但它有2个问题:

  1. 当有一个没有结果,目标不包括在内。它似乎包含或包含创建内连接而不是左连接。
  2. 这不会筛选语言或日期。
+4

可以显示您当前的查询和一些示例过滤条件吗? –

+0

如果你的意思是过滤包括,他们从来没有在EF支持,但仍然不(包括最新的EF核心2.0)。解决方案是投影('select')查询。 –

+0

嗨伊凡,你能展示一个投影查询的例子吗? – user3306290

回答

0

我建议你用你想要的属性创建一个ViewModel类。例如:

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

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

public List<UserViewModel> GetUserViewModelBy(int scoreFilter, string filter1= "", string filter2) 
     { 
      IQueryable<Result> 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(); 
     } 
+0

如果评分过滤器是可选的,过滤器将如何显示。而当它不存在时,我希望所有的用户和目标也是那些比较结果的人。 – user3306290