ef核心linq过滤子实体

时间:2017-08-25 15:21:04

标签: c# entity-framework linq

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

ready: function() {
    return (this.position.startOffset
            && this.position.endOffset
            && this.position.representation.trim().length >= 0
            && this.text.id
            && this.user.id
            && this.concept);
}

然后在你的&#34;存储库&#34;您可以创建一个方法来过滤结果。

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;}
    }