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
当尝试打电话时ids1.First
在 Linq-to-Entities 查询中,出现异常System.NotSupportedException:方法“First”只能用作最终查询操作。考虑在这种情况下使用“FirstOrDefault”方法.
a) 我不明白为什么First
只能用作最终查询操作,因为在我们的示例中First
被召唤IEnumerable<>
( ids1.First()
)而不是在IQueryable<>
。换句话说,First
在 Linq-to-Objects 查询中调用,而不是在 Linq-to-Entities 查询中调用?!
b) 无论如何,为什么必须First
用作最终查询操作,而FirstOrDefault
不一定是最终查询操作?
谢谢
REPLY:
至于 First() 和 FirstOrDefault() 之间的区别 - 我不知道
知道。你试过了吗,有效吗?
是的,它有效
否,First() 正在 LINQ to Entities 查询中调用。你在哪里
子句将转换为: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 查询中?