使用局部变量时,Linq to SQL会给出NotSupportedException

时间:2010-03-11 13:52:46

标签: c# linq-to-sql

在我看来,使用变量临时存储IQueryable是否很重要。请参阅下面的简化示例:

这有效:

List<string> jobNames = new List<string> { "ICT" };
var ictPeops = from p in dataContext.Persons
               where (  from j in dataContext.Jobs
                        where jobNames.Contains(j.Name)
                        select j.ID).Contains(p.JobID)
               select p;

但是当我使用变量临时存储子查询时,我得到一个例外:

List<string> jobNames = new List<string> { "ICT" };
var jobs = from j in dataContext.Jobs
           where jobNames.Contains(j.Name)
           select j.ID;
var ictPeops = from p in dataContext.Persons
               where jobs.Contains(p.JobID)
               select p;
  

“System.NotSupportedException:查询   与本地收藏不是   支持“

我看不出问题所在。这个逻辑不应该在LINQ中起作用吗?

更新: 昨天我找到了使用多个变量时获得1个查询的解决方法:

  var jobs = from j in dataContext.Jobs
             where jobNames.Contains(j.Name)
             select j.ID;
  var ictPeops = from p in dataContext.Persons
                 join j in jobs on p.JobID equals j
                 select p;

但我仍感到困惑。任何人都可以解释为什么第一个查询在使用变量时不起作用?

4 个答案:

答案 0 :(得分:4)

LINQ-2-SQL将您的代码转换为T-SQL。它可以轻松地将您的作业名称列表作为参数传递。但是,在失败的查询中,您正在尝试将SQL表(Persons)加入C#对象(作业);这是一个复杂的C#类型,无法转换为SQL。在第二个查询中使用它之前,您可能需要将作业转换为简单的int数组。 LINQ-2-SQL可能能够处理它。

答案 1 :(得分:0)

尝试将var jobs转换为IList的类型

var jobs = (from j in dataContext.Jobs
            where jobNames.Contains(j.Name)
            select j.ID).ToList();

答案 2 :(得分:0)

出于好奇,这有用吗? (我不是一个很大的LINQ-to-SQL老兄)

var jobNames = from s in new string[] { "ICT" } 
        select s; 
var jobs = from j in dataContext.Jobs 
       where jobNames.Contains(j.Name) 
       select j.ID; 
var ictPeops = from p in dataContext.Persons 
           where jobs.Contains(p.JobID) 
           select p; 
编辑:好的,一个大查询怎么样? :)

var ictPeops = 
    from p in dataContext.Persons
        let jobs =
           from j in dataContext.Jobs
           let jobNames = from s in new string[]{"ICT"} select s
           where jobNames.Contains(j.Name)
           select j.ID
    where jobs.Contains(p.JobID)
    select p;

答案 3 :(得分:-1)

让我解释一下Linq to SQL的工作原理。在代码中编写查询时,此代码不会像其他.net代码和Linq to Objects那样执行。然后将此代码分解为表​​达式树并编译为SQL。如果将所有内容都写为单个表达式,则将其完全转换为SQL。当您分解为两个查询时,它将分为两个单独的查询。并且Linq To SQL无法组装它们。