Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象中的实体框架筛选列表_C#_Entity Framework - Fatal编程技术网

C# 对象中的实体框架筛选列表

C# 对象中的实体框架筛选列表,c#,entity-framework,C#,Entity Framework,我试图在实体框架中过滤对象中的集合。我举了个例子,这很有道理 这是我的查询结果: var filteredClientEmp = context.Clients.Include(x => x.CompanyEmployee) .Where(c => c.HrPersonId == paId && c.CompanyEmployee.Any(e => e.EmployeeBirthday != null && e.E

我试图在实体框架中过滤对象中的集合。我举了个例子,这很有道理

这是我的查询结果:

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;
但是,当我检查FilteredClientTemp对象时,它包含没有生日的员工和左公司值不等于null的记录

客户端对象具有非虚拟的员工列表:

为什么此筛选不起作用?

包含无条件加载所有子实体。因为您投射到具有两个属性的匿名类型:

客户及其所有员工 公司雇员:你的条件适用的客户的雇员 然后继续只投影c,这个c仍然包括所有员工。您需要用筛选的集合覆盖c的CompanyEmployee集合:

.Select(p => { p.c.CompanyEmployee = p.CompanyEmployee; return p.c; })
包含无条件加载所有子实体。因为您投射到具有两个属性的匿名类型:

客户及其所有员工 公司雇员:你的条件适用的客户的雇员 然后继续只投影c,这个c仍然包括所有员工。您需要用筛选的集合覆盖c的CompanyEmployee集合:

.Select(p => { p.c.CompanyEmployee = p.CompanyEmployee; return p.c; })
您的问题在于:

.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; })
您的问题在于:

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

环境干净吗?这是什么EF版本?这可能是EF核心,包含是可操作的,因为完整客户端是投影的一部分。这是EF核心对不起,上下文是干净的,新上下文是干净的吗?这是什么EF版本?这可能是EF核心,包含是可操作的,因为完整的客户端是投影的一部分。这是EF核心对不起,上下文是干净的,这是我最初的想法。但是对于投影查询,通常会忽略include,所以肯定还有其他内容。@Ivan你是什么意思?c.CompanyEmployee在Select中应该为空?我的意思是1由于投影Select 2分配p.c.CompanyEmployee=。。。通常不需要,因为集合应该已经在EF导航属性fixup调用ToList期间分配和填充。但是这可能会有所帮助:整个技术是一种黑客行为,因此可能会因为几个原因而失败。@Ivan 1:假设EF6:除非启用了延迟加载,否则您需要包含实际希望从查询中返回的实体。2需要分配,因为需要筛选包含的集合。还是我遗漏了什么?EF Core是否有不同的做法?我还没有那么频繁地使用它。无论是哪个版本,Include都应该从查询中删除。关系修复程序将填充筛选的集合。由于集合不是虚拟的,或者因为它是ef核心,所以不涉及延迟加载。有点令人沮丧的是,OP在问了一个问题后似乎没有准备好……这就是我最初的想法。但是对于投影查询,通常会忽略include,所以肯定还有其他内容。@Ivan你是什么意思?c.CompanyEmployee在Select中应该为空?我的意思是1由于投影Select 2分配p.c.CompanyEmployee=。。。通常不需要,因为集合应该已经在EF导航属性fixup调用ToList期间分配和填充。但是这可能会有所帮助:整个技术是一种黑客行为,因此可能会因为几个原因而失败。@Ivan 1:假设EF6:除非启用了延迟加载,否则您需要包含实际希望从查询中返回的实体。2需要分配,因为需要筛选包含的集合。还是我遗漏了什么?EF Core是否有不同的做法?我还没有那么频繁地使用它。无论是哪个版本,Include都应该从查询中删除。关系修复程序将填充筛选的集合。由于集合不是虚拟的,或者因为它是ef核心,所以不涉及延迟加载。让人有点沮丧的是,OP似乎没有 在问了一个问题后准备。。。