【发布时间】:2017-08-24 20:35:26
【问题描述】:
我有一个 id 列表。如何选择 id 在列表中的所有行并保留顺序?
这就是我所拥有的:
var ids = new int[]{5, 1, 8, 2, 3};
var items = Db.Items.Where(x => ids.Contains(x.Id));
但它不会保留顺序。
我知道我可以根据 id 对项目进行排序,但我想要 O(n) 复杂度。
这个问题类似于:Select multiple records based on list of Id's with linq 但我需要保持行的顺序
【问题讨论】:
-
为了声明一维
int数组,您应该使用var ids = new int[] {5, 1, 8, 2, 3};。 -
此外,此查询已“编译”,因此可能在数据库级别完成。大多数数据库不对订单做出任何保证,除非使用
ORDER BY语句(或 LINQ 等效语句)。 -
谢谢。它是在数据库级别完成的,但应该有一种方法来执行我的查询并保持 O(n) 复杂性,因为理论上是可能的。如果没有语法可以得到这个结果,那么这似乎是一个设计缺陷。例如我可以执行 N 个查询并保留顺序,并具有适当的复杂性。但我想在 1 个查询中执行此操作。
-
不,因为没有 where 的查询也没有保证顺序。如果您要重新导入数据库、修改几行等,则会对获取对象的顺序产生巨大影响。
-
@Sach 通常你是对的,但在这种情况下,LINQ 操作由实体框架专门处理。查询被分析并转换为 SQL 查询。在这种情况下,将 Contains 转换为 Join 操作就足够聪明了。
标签: sql-server performance entity-framework linq