2011-07-13 28 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