引用不支持的非标量变量

时间:2011-07-13 04:49:00

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

我的查询下面的帽子有问题吗?我收到NotSupportedException“”无法创建JobLanguage类型的常量值。在此上下文中仅支持基本类型(例如Int32,String和Guid')。“

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

1 个答案:

答案 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执行内部查询,以引用数据的数据库副本而不是本地数据。