【发布时间】:2025-12-11 16:55:02
【问题描述】:
int[] ids1 = { 1, 2, 3 };
int[] ids2 = { 1, 5, 6 };
var result = from a in ids1
where a == ids2.First()
select a;
foreach (var item in result) ; //ok
var employees = from c in context.Employees.
where c.EmployeeID == ids1.First()
select c;
foreach (var item in employees); // NotSupportedException
尝试在 Linq-to-Entities 查询中调用 ids1.First 时,出现异常
System.NotSupportedException:方法“First”只能用作最终查询操作。考虑在此实例中使用“FirstOrDefault”方法。
a) 我不明白为什么 First 只能用作最终查询操作,因为在我们的示例中 First 是在 IEnumerable<> ( ids1.First() ) 上而不是在 IQueryable<> 上调用的。换句话说,First 在 Linq-to-Objects 查询中调用,而不是在 Linq-to-Entities 查询中调用?!
b) 无论如何,为什么必须将First 用作最终查询操作,而FirstOrDefault 不必用作最终查询操作?
谢谢
回复:
至于 First() 和 FirstOrDefault() 之间的区别 - 我不知道 知道。你试过了吗,它有效吗?
是的,它有效
否,在 LINQ to Entities 查询中调用了 First()。你在哪里 子句将转换为: Where(c => c.EmployeeID == ids1.First())
a) 我现在有点困惑。我意识到 ids1.First 本质上是在 Linq-to-Entities 查询中调用的,但事实仍然是 First 在 IEnumerable<> 上被调用,因此 First 在 Linq-to-Objects 查询中被调用,而这个 Linq -to-Object 查询又在 Linq-To-entities 查询中调用——至少我是这么理解的?!
或者您是在暗示 First 以某种方式在 IQeryable<> 上被调用?
b) 我知道(c => c.EmployeeID == ids1.First()) 会被转换成一个表达式树,但是为什么ids1.First() 没有在转换发生之前执行呢?
c) 无论如何,一旦转换为表达式树,我假设当 sql 提供程序接收到我们的where 子句的表达式树并尝试将其转换为 Sql 命令时,这个 Sql 提供程序没有“权力" 执行ids1.First 以取回结果(然后将其放入 Sql 查询中),因此出现异常?!
第二次回复:
a) 我仍然很困惑为什么在转换为表达式树之前没有执行ids1.First?!即,带有以下子句
Where(c => c.EmployeeID == 2+3)
表达式2+3 在此Where 子句转换为表达式树之前被执行!而ids.First 也是一种表达方式,所以我会期待类似的行为?!
b) 抱歉重复了,但我的假设是否真的让我很烦
First 在 Linq-to-Objects 查询中被调用,而这个 Linq-to-Object 查询又在 Linq-To-entities 查询中被调用——对吗?!
c) 也许我误解了您的帖子,但您是否暗示大多数其他 Linq-to-Object 运算符可以在 IEnumerable<> E 上调用,即使 E 包含在 Linq-to-Entities 查询中?
【问题讨论】:
标签: linq-to-entities linq-to-objects