Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains () - PullRequest
25 голосов
/ 17 ноября 2011

Я использую 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 ().

Ответы [ 4 ]

40 голосов
/ 17 ноября 2011

Вы не можете использовать соединение между источником SQL и локальным источником. Вам нужно будет перенести данные SQL в память, прежде чем вы сможете присоединиться к ним. В этом случае вы на самом деле не выполняете объединение, так как вы берете только элементы из первой коллекции, что вам нужно - это select ... where ... 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 взяты из списка идентификаторов в коллекции локальных объектов.

24 голосов
/ 17 ноября 2014

Вы не можете присоединить локальный источник к источнику SQL, но вы МОЖЕТЕ присоединить источник SQL к локальному, v.v.

var SE = from c1 in obj.SectionObjects
              join c in Shop.Sections on c1.SectionId equals c.SectionId
              select c;

Другими словами, местный источник должен стоять первым

11 голосов
/ 17 ноября 2011

Это должно работать и выполняться на стороне базы данных (используя IN), а не в памяти:

var SE = from c in Shop.Sections 
        where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId)
        select c; 

L2S Profiler очень полезен для такого рода вещей - вы можете сравнить различные SQL, генерируемые моим решением и другими решениями.

0 голосов
/ 09 августа 2014

var SE = from c в Shop.Sections.AsEnumerable (). ToList () объединяет c1 в obj.SectionObjects.AsEnumerable (). ToList () в c.SectionId равно c1.SectionId select c;

dataGridView1.DataSource = SE;

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