Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用局部序列_C#_Sql_Linq - Fatal编程技术网

C# 除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用局部序列

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行中遇到了这个错误 错误消息是

我在我的项目中使用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实现中不能使用局部序列


不能在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。见下面的答案。