c# - Linq:在哪里+保持秩序
问题描述
我目前有一个 ID 列表,可以说
List<int> ids = {3, 1, 2}
我希望为列表中的所有项目调用 IQueryable,但保持 ids 顺序。现在我这样做:
var result = query.Where(x => ids.Contains(w.Id)).ToList();
问题是我丢失了订单。
一种解决方案是添加:
.OrderBy(i => ids.IndexOf(i));
但它是 SQL 中的一个额外的 ORDER 子句,不确定性能!
有没有更有效的方法?
解决方案
查询中的Where
子句最终将被翻译为(在标准 SQL 中):
WHERE w.Id IN (3, 1, 2)
标准 SQL 中没有办法指定输出的顺序应该与IN
子句中匹配项的顺序相匹配。为此,您需要执行一个相当复杂的 SQL 语句(例如ORDER BY CASE WHEN Id = 3 THEN 1 WHEN Id = 1 THEN 2 ...
),这在 Linq 中可能无法表示。一些替代方案是:
- 单独查询每个 ID,连接结果
- 查询所有内容并在内存中排序(您建议的方法非常好)
知道哪个性能更好的唯一方法是尝试它们并测量结果。
推荐阅读
- mysql - 无法从 App Engine 中的 Node JS 连接到 Cloud MySQL
- c++ - 在 Windows 上共享 OpenGL 上下文
- wordpress - “volumes”如何用 docker-compose 覆盖 docker 镜像的原始文件?
- javascript - 错误:ER_NO_DB_ERROR:没有选择数据库 NODEJS MYSQL
- sql - 如何在 oracle SQL 中将表中的日期从 16-04-06 转换为 06-APR-16?
- go - 解组复杂的json数据结构
- vb.net - 多个文件组合的 WebClient AsyncCompleted 事件
- amazon-ec2 - Windows EC2 具有 FHD (1920x1080) 分辨率
- racket - 从 SML 转换为球拍的插入语句不起作用
- webpack - Symfony 5 和 sudo commad 使用 Windows 10