Linq to SQL дает NotSupportedException при использовании локальных переменных - PullRequest
5 голосов
/ 11 марта 2010

Мне кажется, что имеет значение, используете ли вы переменную для временного хранения 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?

UPDATE: Вчера я нашел обходной путь для получения 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 ]

4 голосов
/ 12 марта 2010

LINQ-2-SQL переводит ваш код в T-SQL. Он может легко передать ваш список имен заданий в качестве параметра. Но в своем неудачном запросе вы пытаетесь соединить таблицу SQL (Persons) с объектом C # (jobs); это сложный тип C #, который нельзя преобразовать в SQL. Вам, вероятно, нужно преобразовать задания в простой массив int, прежде чем использовать его во втором запросе. LINQ-2-SQL может справиться с этим.

0 голосов
/ 11 марта 2010

попробуйте преобразовать var jobs в тип IList

var jobs = (from j in dataContext.Jobs
            where jobNames.Contains(j.Name)
            select j.ID).ToList();
0 голосов
/ 11 марта 2010

Из любопытства, это работает? (Я не большой чувак 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;
0 голосов
/ 11 марта 2010

Позвольте мне объяснить, как работает Linq to SQL. Когда вы пишете запрос в коде, этот код не выполняется как другой код .net и Linq to Objects. Затем этот код разбивается на дерево выражений и компилируется в SQL. Если вы пишете все как одно выражение, оно полностью преобразуется в SQL. Когда вы разбиваете на два запроса, он будет разбит на два отдельных запроса. И Linq To SQL не может собрать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...