我有一个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个问题:
- 当有一个没有结果,目标不包括在内。它似乎包含或包含创建内连接而不是左连接。
- 这不会筛选语言或日期。
可以显示您当前的查询和一些示例过滤条件吗? –
如果你的意思是过滤包括,他们从来没有在EF支持,但仍然不(包括最新的EF核心2.0)。解决方案是投影('select')查询。 –
嗨伊凡,你能展示一个投影查询的例子吗? – user3306290