我在项目中使用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实现。
答案 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;