使用linq到sql比较两个列表

时间:2011-07-11 23:29:10

标签: .net asp.net asp.net-mvc linq entity-framework

说我有两个清单:

List<CanidateSkill> canidateSkills;
List<JobDesiredSkill> desiredSkills;

class CanidateSkill
{
    public Guid CanidateId { get; set; }
    public Guid SkillId { get; set; }
}

class JobDesiredSkill
{
    public Guid JobId { get; set; }
    public Guid SkillId { get; set; }
}

您如何确定:

  1. JobDesiredSkills中至少有一项包含在CandidateSkills中(在SkillId上匹配)

  2. JobDesiredSkills中的所有项目都包含在CandidateSkills中

  3. 我试过这个,但是得到了这个错误:无法创建类型的常量值在此上下文中仅支持基本类型(例如Int32,String和Guid')。

     return from candidate in _db.Candidates                           
     where (candidate.CandidateSkills.Any(c => job.JobDesiredSkills.Any(j => j.SkillId == c.SkillId))) 
     select candidate;
    

    我也试过这个,但是Contains需要一个JobDesiredSkill对象,但是c是CandidateSkillObject。

     return from candidate in _db.Candidates                           
     where CandidateSkills.Any(c => JobDesiredSkills.Contains(c)) 
     select candidate;
    

    由于

2 个答案:

答案 0 :(得分:5)

有两种符合您确切需求的linq方法:

  1. IEnumerable.Any()
  2. IEnumerable.All()
  3. 编辑:

    您需要在集合中选择“Ids”的“投影”以获取它们的可枚举集合,然后您可以使用任何/所有(您无法在没有显式比较对象的情况下比较复杂类型)

    这是一个简单的例子,我希望它有所帮助。

    List<Guid> skills = 
        new List<Guid>( Enumerable.Range( 0, 20 ).Select( n => Guid.NewGuid() ) );
    
    List<CanidateSkill> canidateSkills = new List<CanidateSkill>
    (
        Enumerable.Range( 0, 10 ).Select( c => new CanidateSkill() { CanidateId = Guid.NewGuid(), SkillId = skills.ElementAt( c ) } )
    );
    
    List<JobDesiredSkill> desiredSkills = new List<JobDesiredSkill>
    (
        Enumerable.Range( 5, 15 ).Select( d => new JobDesiredSkill() { JobId = Guid.NewGuid(), SkillId = skills.ElementAt( d ) } )
    );
    
    var anyDesiredSkills = canidateSkills.Any( c => desiredSkills.Select( ds => ds.SkillId ).Contains( c.SkillId ) ); // true
    var allDesiredSkills = canidateSkills.All( c => desiredSkills.Select( ds => ds.SkillId ).Contains( c.SkillId ) ); // false
    

    (注意:我还编辑了你的问题以更新此代码中使用的示例类,希望你不介意。)

答案 1 :(得分:0)

我现在没有方便的Visual Studio,但它应该是这样的:

1

 JobDesiredSkills.Where(j=>CandidateSkills.Any(c=>c.SkillId == j.SkillId)==true).ToList().Count()>0
2。
 JobDesiredSkills.Where(j=>CandidateSkills.Where(c=>c.SkillId == j.SkillId).ToList().Count()>0).ToList().Count()==JobDesiredSkills.Count()