lambda表达式试图根据另一个列表查询一个列表

时间:2010-12-23 06:44:11

标签: c# lambda

关于如何使用lambda表达式很好地做到这一点的一些建议。

我想要的是根据代理商获取展示位置列表。我想要placement.agency!= agency的展示位置,但其中placement.agencypersonnel包含任何代理人员。

因此,该位置不适用于该机构,但该机构的员工参与其他机构的安置

我不知道如何根据第二个条件进行查询。

类似于:

// agency is being passed in
     var agencySupervisors = agency.AgencyPersonnel;

     return agency.Placements
            .Where(p => p.Supervisors.Contains(agencySupervisors))
            .Where(p => p.Agency != agency);

我知道Contains应该引用一个对象而不是一个集合 - 这就是它错误的原因..但是我不知道如何让它检查集合中的所有对象。

还尝试过任何

 return agency.Placements
           .Where(p => agencySupervisors.Any<PlacementSupervisor>(p.Supervisors))
           .Where(p => p.Agency != agency);

所以希望它只是我使用了错误的!!

另一个工作中的扳手正在试图弄清楚安置主管和代理人员实体如何相互关联..我认为它与AgencyPersonnelId = SupervisorId相关联,所以我猜这也必须考虑到我的表达

谢谢!

编辑:如果两个列表中的对象类型不相同,我该如何处理 - 但我知道Id将匹配。我是否必须编写一个比较器并以某种方式将其合并到表达式中?即。 AgencyPersonnelId = SupervisorId

我试过了:

return placements
                .Where(p => p.Supervisors.Any(supervisor => agencySupervisors.Any(ap => ap.AgencyPersonnelId == supervisor.SupervisorId)));

但它没有给我任何结果,所以显然是错误的。

编辑:实际上当我尝试遍历返回集合中的位置时,我得到一个空引用异常 - 所以我不确定它是否与我的表达式或我的方式有关返回结果。

3 个答案:

答案 0 :(得分:2)

你离Any&amp; Contains - 立即尝试

return agency.Placements        
    .Where(p => agencySupervisors.Any(supervisor => p.Supervisors.Contains(supervisor))
    .Where(p => p.Agency != agency);

答案 1 :(得分:0)

我认为您也可以使用.Intersect

return agency.Placements
         .Where(p => agencySupervisors.Intersect(p.Supervisors).Any()
                     && p.Agency != agency); 

答案 2 :(得分:0)

感谢大家的帮助 - 因为对象属于不同的类型我最终不得不做一些不同的事情 - 但后来发现我能够使用他们的ID进行比较,结果是:

var agencySupervisors = (from ap in agency.AgencyPersonnel
                                    where ap != null
                                        select ap.AgencyPersonnelId).ToList();

            return 
                (from p in m_PlacementRepository.Linq orderby p.PlacementId select p)
                .Where(p => p.Agency != agency)
                .Where(p => p.Supervisors != null && p.Supervisors.Any(s => agencySupervisors.Contains(s.SupervisorId)));

另外正如Mikael正确地指出我首先从错误的收集开始:)