C# 除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用局部序列
我在我的项目中使用LINQ,我的代码是:C# 除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用局部序列,c#,sql,linq,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行中遇到了这个错误 错误消息是
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实现中不能使用局部序列
不能在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子句的值来自本地对象集合中的ID列表。这应该在数据库端(使用
中的)工作并完成,而不是在内存中:
var SE = from c in Shop.Sections
where obj.SectionObjects.Select(z => z.SectionId).Contains(c.SectionId)
select c;
对于这类事情非常有用-您可以比较我的解决方案和其他解决方案生成的不同SQL。var SE=from c in Shop.Sections.AsEnumerable().ToList()
将c1连接到c.SectionId上的obj.SectionObjects.AsEnumerable().ToList()中等于c1.SectionId
选择c
dataGridView1.DataSource=SE 无法将本地源连接到SQL源,
但您可以将SQL源连接到本地,v.v
var SE = from c1 in obj.SectionObjects
join c in Shop.Sections on c1.SectionId equals c.SectionId
select c;
换句话说,本地来源必须放在第一位将鼠标悬停在Shop.Sections上,并告诉我们它的类型。然后将鼠标悬停在obj.SectionObjects上,告诉我们它的类型。此代码无效,错误为:错误1“System.Data.Linq.EntitySet.Contains(Shop.SectionObject)”的最佳重载方法匹配有一些无效的参数。是的,看起来L2S基本上是死的-在数据库端比在内存中快得多!这应该是公认的答案。在这种方法中(除非我大错特错),SQL源不会被枚举(因此避免了一些DB开销)。如果DB表很小,这种解决方案就可以工作。但是,它确实枚举了从DB到内存(通过SQL跟踪验证)的整个表来进行比较。我们有一个复杂的多表“SQLSourcetoLocal”场景,结果开始出现内存不足异常错误。使用contains的其他答案允许使用“IN”在SQL Server上运行查询,并且只提取相关记录。这些答案应该是公认的答案,尤其是对于较大的表。这不完全正确。如果先使用本地源,则可以使用join。见下面的答案。