【问题标题】:Referencing Non-Scalar Variables Not Supported不支持引用非标量变量
【发布时间】:2011-10-04 04:36:46
【问题描述】:

我下面的查询有什么问题吗?我收到 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

【问题讨论】:

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


    【解决方案1】:

    嗯,您可以尝试的一件事是提取一组所需的语言 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 执行内部查询,以引用数据的数据库副本而不是本地副本。

    【讨论】:

    • 这正是我刚刚尝试过的(将其提取出来),它奏效了……谢谢。但为什么它会起作用?
    • @Prabhu:不同之处在于只有 list 最终出现在表达式树中(将查询表示为数据)而不是更复杂的“作业”。基本上 EF 还不够聪明,无法理解您在工作中执行的所有操作,因此您需要在达到 EF 级别之前完成这些操作。
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多