我试图过滤Entity Framework中对象内的集合。我按照this示例,这是有道理的。
这是我的结果查询:
var filteredClientEmp = context.Clients.Include(x => x.CompanyEmployee)
.Where(c => c.HrPersonId == paId && c.CompanyEmployee.Any(e => e.EmployeeBirthday != null && e.EmpType == 2 &&
e.LeftCompany == null))
.Select(c => new
{
c,
CompanyEmployee =
c.CompanyEmployee.Where(e => e.EmployeeBirthday != null && e.EmpType == 2 &&
e.LeftCompany == null)
})
.ToList()
.Select(pro => pro.c)
.ToList();
return filteredClientEmp;
但是,当我检查filteredClientEmp
对象时,它包含没有生日的员工和记录左公司值不等于null的记录。
Client
对象的非虚拟列表为Employee
:
public List<Employee> CompanyEmployee { get; set; }
为什么这种过滤不起作用?
答案 0 :(得分:2)
Include()
无条件地加载所有子实体。因为您投影到具有两个属性的匿名类型:
c
:客户及其所有员工CompanyEmployee
:适用您条件的客户的员工然后继续仅投影c
,此c
仍包含所有员工。您需要使用已过滤的集合覆盖c
的CompanyEmployee集合:
.Select(p => { p.c.CompanyEmployee = p.CompanyEmployee; return p.c; })
答案 1 :(得分:1)
您的问题出在:
.Select(pro => pro.c).ToList();
您没有使用过滤的员工列表返回客户:
CompanyEmployee = c.CompanyEmployee.Where(e => e.EmployeeBirthday != null && e.EmpType == 2 && e.LeftCompany == null)
事实上,如果根本不使用匿名类型,则该属性。而是返回所有客户端的筛选列表:
1)具有指定的HrPersonId和
2)至少有一名员工生日,员工类型为2且未离开公司。
要使用已过滤列表返回客户端,您的最终选择应如下所示:
.Select(pro => { pro.c.CompanyEmployee = pro.CompanyEmployee; return pro.c; })