Подтвердить что ты не робот

Локальная последовательность не может использоваться в реализации операторов запросов 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().

4b9b3361

Ответ 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;