首页 > 解决方案 > 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 子句,不确定性能!

有没有更有效的方法?

标签: c#.netmongodblinq

解决方案


查询中的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,连接结果
  • 查询所有内容并在内存中排序(您建议的方法非常好)

知道哪个性能更好的唯一方法是尝试它们并测量结果。


推荐阅读