表达式查找包含整数数组中所有元素的所有对象

时间:2017-01-23 20:46:59

标签: c# linq lambda

我很难通过概述的查询返回正确的结果列表。我正在尝试将工作列表返回给用户(专业人员),其中专业人员具有工作中指定的所有部门。即如果该工作具有扇区ID为6,7& 8,专业人员必须具备技巧6,7和8。

我已经在HashSet列表中找到了专业人员,并尝试了各种各样的方法来获得我想要的结果。任何人都可以指出我出错的地方。

var userId = User.Identity.GetUserId();
var user = _context.Users.Single(u => u.Id == userId);

var professional = _context.Professionals
                           .Include(p => p.Positions)
                           .Include(p => p.Sectors)
                           .Single(p => p.Id == userId);

var positions = new HashSet<int>(professional.Positions.Select(c => c.Id));

var professionalSectors = new HashSet<int>(professional.Sectors.Select(c => c.Id));


var all = new HashSet<int>(_context.Sectors.Select(c => c.Id));

var proDoesNotHaveSectors = new HashSet<int>(all.Except(professional.Sectors.Select(c => c.Id)));

var feedQuery = from o in _context.Jobs
                from pos in o.Positions
                from sec in o.Sectors
                where positions.Contains(pos.Id) && !proDoesNotHaveSectors.Contains(sec.Id)
                select o;

我也尝试过使用以下查询,如果我只是从具有nullable int []的页面进行过滤,这可以正常工作吗? selectedSectors但不包含来自数据库的Hashset或int []数组!!

var jobs = _context.Jobs
                   .Where(p => !professionalSectors.Select(t => t)  //Requires (t => t.Value) if int? [] array
                                                   .Except(p.Sectors.Select(t => t.Id))
                                                   .Any());

我一直围绕着做同样的事情再次期待不同的结果,所以希望有人可以指出我正确的方向。先感谢您。

1 个答案:

答案 0 :(得分:0)

根据解释,看起来您正在寻找Sectors的{​​{3}}方法(以及Positions的{​​{3}}):

var professional = ...;
var positions = ...;
var professionalSectors = ...;

var jobs = _context.Jobs
    .Where(job => job.Positions.Any(position => positions.Contains(position.Id))
        && job.Sectors.All(sector => professionalSectors.Contains(sector.Id)));

我在上述查询中看到的唯一潜在缺陷是它还将包含没有关联扇区的作业(由于All方法如何处理空序列)。很可能它不是一个真实的案例(甚至可能被视为一个功能 - 工作不需要技能),但如果需要,只需添加条件

&& job.Sectors.Any()