2011-07-13 17 views
0

以下のクエリでhatが間違っていますか? 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:違いは、* list *だけがより複雑な "仕事"ではなく、式ツリー(データとしてのクエリの表現)に終わることです。基本的に、EFはあなたが仕事で行っていたすべての操作を理解するのに十分なほどスマートではないので、EFレベルに達する前にEFを実行する必要があります。 –

+0

ありがとうございます... – Prabhu

関連する問題