局部序列不能用于LINQ to SQL查询操作符的实现,除了Contains()操作符

本文关键字:操作符 实现 Contains 除了 查询 不能 用于 LINQ SQL to 局部 | 更新日期: 2023-09-27 18:14:50

我在我的项目中使用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()操作符。

局部序列不能用于LINQ to SQL查询操作符的实现,除了Contains()操作符

不能在SQL源和本地源之间使用Join。在连接SQL数据之前,需要将SQL数据放入内存。在这种情况下,你并没有真正做一个连接,因为你只从第一个集合中获取元素,你想要的是一个select…在查询中选择,您可以使用Contains方法获得。

 var SE = Shop.Sections.Where( s => obj.SectionObjects
                                       .Select( so => so.SectionId )
                                       .Contains( s.SectionId ))
                       .ToList();

翻译

select * from Sections where sectionId in (...)
,其中in子句的值来自本地对象集合中的id列表。

不能将本地源连接到SQL源,但是你可以将SQL源连接到本地,v.v。

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

换句话说,本地源必须放在第一位

这应该在数据库端完成(使用IN),而不是在内存中:

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

L2S Profiler对于这些事情非常有帮助-您可以比较我的解决方案和其他解决方案生成的不同SQL。

var SE = from c in Shop.Sections.AsEnumerable().ToList()在c.SectionId等于c1时,将c1加入obj.SectionObjects.AsEnumerable(). tolist()中。SectionId选择c;

dataGridView1。数据源= SE;