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

nic*_*ojs 5 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;
Run Code Online (Sandbox Code Playgroud)

但是,当我使用变量临时存储子查询时,出现异常:

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;
Run Code Online (Sandbox Code Playgroud)

“ 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;
Run Code Online (Sandbox Code Playgroud)

但是我还是很困惑。谁能阐明使用变量时为什么第一个查询不起作用?

300*_*aud 5

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