除Contains()运算符外,本地序列不能用于查询运算符的LINQ to SQL实现

时间:2011-11-17 08:59:50

标签: c# sql linq

我在项目中使用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;行中遇到此错误 错误信息是:

  

除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。

4 个答案:

答案 0 :(得分:39)

您不能在SQL源和本地源之间使用Join。您需要先将SQL数据放入内存,然后才能加入它们。在这种情况下,你实际上并没有进行连接,因为你只从第一个集合中获取元素,你想要的是一个 select ... where ... selectid in query,你可以使用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列表。

答案 1 :(得分:24)

您无法将本地源加入SQL源, 但您可以将SQL源加入本地,v.v。

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

换句话说,本地资源必须先来

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:-5)

var SE =来自Shop.Sections.AsEnumerable()中的c。ToList()                     在obj.SectionObjects.AsEnumerable()中连接c1.c.SectionId上的ToList()等于c1.SectionId                     选择c;

dataGridView1.DataSource = SE;