public IQueryable<Candidate> GetMatchingCandidates(Job job)
{
return from candidate in _db.Candidates
where candidate.CandidateLanguages.Any(c => job.JobLanguages.Select(jl => jl.LanguageId.Value).Contains(c.LanguageId))
orderby candidate.Name descending
select candidate;
}
//caller
List<Candidate> matchingCandidates = _repository.GetMatchingCandidates(job).ToList();
显然,这是一个已知问题(http://msdn.microsoft.com/en-us/library/bb896317.aspx#RefNonScalarClosures),但我想知道如何绕过它。基本上,我正在尝试做的是:Comparing two lists using linq to sql
答案 0 :(得分:2)
嗯,您可以尝试的一件事是从一开始就提取所需的语言ID集:
(我假设语言ID是字符串。如果不是,请提供更多信息。)
public IQueryable<Candidate> GetMatchingCandidates(Job job)
{
List<string> languageIds = job.JobLanguages
.Select(jl => jl.LanguageId.Value)
.ToList();
return from candidate in _db.Candidates
where candidate.CandidateLanguages
.Any(languageIds.Contains(c.LanguageId))
orderby candidate.Name descending
select candidate;
}
如果作业已在数据库中,您可以尝试使用作业ID执行内部查询,以引用数据的数据库副本而不是本地数据。