Сравнение двух списков с использованием linq к sql - PullRequest
3 голосов
/ 12 июля 2011

Скажите, у меня есть два списка:

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

Я пробовал это, но получаю эту ошибку: Невозможно создать постоянное значение типа. В этом контексте поддерживаются только примитивные типы (такие как 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 ]

5 голосов
/ 12 июля 2011

Существует два метода linq, которые точно соответствуют вашим потребностям:

  1. IEnumerable.Any ()
  2. IEnumerable.All ()

Редактировать:

Вам нужно выбрать «Проекцию» «Идентификаторов» в коллекции, чтобы получить их перечисляемую коллекцию, затем вы можете использовать любые / все нате (вы не можете сравнивать сложные типы без явного объекта сравнения).

Вот тривиальный пример, надеюсь, это поможет.

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

(Примечание: я также редактировал ваш вопросчтобы обновить классы примеров, используемые в этом коде, надеюсь, вы не возражаете.)

0 голосов
/ 12 июля 2011

У меня сейчас нет под рукой 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...