对象内的实体框架过滤列表

时间:2018-01-11 10:18:17

标签: c# entity-framework

我试图过滤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; }

为什么这种过滤不起作用?

2 个答案:

答案 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; })