Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, за исключением оператора Contains()
Я использую LINQ в моем проекте, а мой код:
var SE = from c in Shop.Sections
join c1 in obj.SectionObjects on c.SectionId equals c1.SectionId
select c;
dataGridView1.DataSource = SE;
но я столкнулся с этой ошибкой в строке dataGridView1.DataSource = SE;
сообщение об ошибке:
Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains().
Ответы
Ответ 1
Вы не можете использовать соединение между источником SQL и локальным источником. Вам нужно будет доставить данные SQL в память, прежде чем вы сможете присоединиться к ним. В этом случае вы действительно не присоединяетесь, так как вы берете только элементы из первой коллекции, и вы хотите выбрать... где... selectid в запросе, который вы можете использовать с помощью метода Contains.
var SE = Shop.Sections.Where( s => obj.SectionObjects
.Select( so => so.SectionId )
.Contains( s.SectionId ))
.ToList();
Переводит на
select * from Sections where sectionId in (...)
где значения для предложения in взяты из списка идентификаторов в коллекции локальных объектов.
Ответ 2
Вы не можете подключиться к источнику локального источника в SQL,
но вы можете присоединиться к источнику SQL к локальному, v.v.
var SE = from c1 in obj.SectionObjects
join c in Shop.Sections on c1.SectionId equals c.SectionId
select c;
Другими словами, локальный источник должен быть первым
Ответ 3
Это должно работать и выполняться на стороне базы данных (используя IN
), а не в памяти:
var SE = from c in Shop.Sections
where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId)
select c;
L2S Profiler очень полезен для таких вещей - вы можете сравнить различные SQL, сгенерированные моим решением и другими решениями.
Ответ 4
var SE = from c в Shop.Sections.AsEnumerable(). ToList() join c1 в obj.SectionObjects.AsEnumerable(). ToList() в c.SectionId равен c1.SectionId выберите c;
dataGridView1.DataSource = SE;