Pra*_*bhu 3 .net linq asp.net asp.net-mvc 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; }
}
Run Code Online (Sandbox Code Playgroud)
你如何确定是否:
JobDesiredSkills中至少有一项包含在CandidateSkills中(在SkillId上匹配)
JobDesiredSkills中的所有项目都包含在CandidateSkills中
我尝试了这个,但是得到了这个错误:无法创建类型的常量值在此上下文中仅支持基本类型(例如Int32,String和Guid').
return from candidate in _db.Candidates
where (candidate.CandidateSkills.Any(c => job.JobDesiredSkills.Any(j => j.SkillId == c.SkillId)))
select candidate;
Run Code Online (Sandbox Code Playgroud)
我也试过,但包含需要一个JobDesiredSkill对象,但c是CandidateSkillObject.
return from candidate in _db.Candidates
where CandidateSkills.Any(c => JobDesiredSkills.Contains(c))
select candidate;
Run Code Online (Sandbox Code Playgroud)
谢谢
有两种linq方法可满足您的确切需求:
编辑:
您需要在集合中选择"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
Run Code Online (Sandbox Code Playgroud)
(注意:我也编辑了你的问题来更新这段代码中使用的示例类,希望你不介意.)