LINQ where子句中的数组元素导致运行时错误与编译时错误

时间:2013-07-15 18:47:01

标签: c# .net linq entity-framework linq-to-entities

我已经知道你不能在带有LINQ的where子句中使用数组元素。例如:

Department department = db.Departments.Single(d => d.DepartmentID == teams[i].DepartmentID);

失败了。但是,我很好奇为什么在编译时没有捕到它?是否存在这样的情况,可以防止这种声明的编译时间错误?

3 个答案:

答案 0 :(得分:5)

它没有在编译时捕获,因为它完全有效的C#。表达式转换为适当的表达式树 - 它只是实体框架不支持的表达式树。另一个LINQ提供商可能能够支持它。

C#编译器对LINQ提供程序一无所知,也不应该。它知道的唯一相关方面是如何从lambda表达式构造表达式树,如何调用扩展方法,以及如何使用查询表达式(这里不使用,但通常是LINQ的一部分)。

区分语言支持和支持非常重要 - 特别是在LINQ的情况下。

答案 1 :(得分:2)

c#编译器将该代码转换为有效的表达式树,LinqToEntities查询转换器在运行时才有机会使用该树。

c#编译器无法知道LinqToEntities查询转换器的功能。

答案 2 :(得分:0)

在编译时,C#编译器只是尝试将您的代码作为有效的表达式树,如果您的代码可以转换为有效的表达式树,它将永远不会产生编译时错误。在编译时,如果索引在范围内,它将永远不会检查数据是否来了。但是在运行时,只有当您的代码尝试将数据加载到其中时,只有代码才会给出异常。 由于您的代码是正确的,并且可以形成表达式树,因此它不会给出任何错误,但在运行时尝试查看数据时会抛出异常。据我所知,您可能会将索引超出范围异常。由于你已经使用过" teams [i] .DepartmentID",如果团队的第i个值不包含任何部门,那么它会给你这个错误。如果您正在使用循环,则迭代循环直到i-1。