2011-07-13 27 views
0

我的查询下面有错误?我得到一个NotSupportedException“”无法创建一个JobLanguage类型的常量值。只有原始类型(“如的Int32,字符串和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

回答

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

+0

这正是我刚刚尝试(解压出来),它的工作......谢谢。但是它为什么起作用? – Prabhu

+1

@Prabhu:不同之处在于,只有*列表*结束于表达式树(表示查询的数据),而不是更复杂的“作业”。基本上EF没有足够的智能来理解你在工作中执行的所有操作,所以你需要在EF级别之前完成它们。 –

+0

谢谢,有道理...... – Prabhu