EF Linq.如何保持“Where in”排序[重复]

vyswwuz2  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(122)

此问题已在此处有答案

Sort a list from another list IDs(4个答案)
3个月前关闭。
我有一个ID列表,我需要从数据库中以完全相同的顺序检索实体,列表中的ID。
这样的查询会返回错误的订单:

List<Guid> listOfIds = targetIds;
var result = await dbContext
      .TargetEnities
      .Where(x => listOfIds.Contains(x.Id))
      .ToListAsync();

我看到了一种在循环和联合结果中发出请求的方法,但它看起来太昂贵了。
怎么解决呢?

c90pui9n

c90pui9n1#

一旦你有了你的清单,然后试试这个:

var sorted = result.OrderBy(x => listOfIds.IndexOf(x.Id)).ToList();

如果有大量的id,那么使用字典是一个很好的选择,可以加快这个过程:

var ordering = listOfIds.Select((g, i) => (g, i)).ToDictionary(x => x.g, x => x.i);
var sorted = result.OrderBy(x => ordering[x.Id]).ToList();
yeotifhr

yeotifhr2#

数据库不保证任何顺序。如果未指定ORDER BY子句,SELECT命令可以按任何顺序返回记录。具体来说,不保证记录以INSERT顺序返回。
数据库表不是Excel工作表。也就是说,没有自然的行数,因为数据库理论是基于集合论的,集合根据定义是无序的。
必须指定显式顺序

var result = await dbContext
      .TargetEnities
      .Where(x => listOfIds.Contains(x.Id))
      .OrderBy(x => x.MyColumn)
      .ThenBy(x => x.SomeOtherColumn)
      .ThenBy(...)
      .ToListAsync();

还有OrderByDescendingThenByDescending扩展方法可以按降序排序。您必须从OrderByOrderByDescending开始,然后可以选择添加多个ThenByThenByDescending调用。

相关问题