LINQ连接查询返回结果顺序与指定集合不一致的问题
问题描述
我有一个名为Columns的数据库表,包含ColumnId和ColumnName两列。另外定义了一个自定义顺序的集合:
List<int> colIds = new List<int>() { 7, 1, 6, 2 };
但当我用LINQ将集合与数据库表做连接查询时,返回结果是按数据库表的存储顺序排列,而非集合定义的顺序:
var sql = from c in Columns join col in colIds on c.ColumnId equals col select c; sql.Dump();
查询结果顺序和数据库表一致,不是集合里的7,1,6,2顺序。
解决方案
1. 内存中按集合索引排序
先将匹配的数据加载到内存,再根据集合中元素的索引排序,适合小集合场景:
var colIds = new List<int>() { 7, 1, 6, 2 }; var result = Columns.Where(c => colIds.Contains(c.ColumnId)) .ToList() .OrderBy(c => colIds.IndexOf(c.ColumnId)); result.Dump();
2. 数据库端用CASE语句排序
如果数据量较大,希望在数据库层面完成排序,可以通过LINQ生成CASE语句实现:
var colIds = new List<int>() { 7, 1, 6, 2 }; var result = Columns.Where(c => colIds.Contains(c.ColumnId)) .OrderBy(c => c.ColumnId == 7 ? 0 : c.ColumnId == 1 ? 1 : c.ColumnId == 6 ? 2 : c.ColumnId == 2 ? 3 : 4); result.Dump();
3. 字典映射排序权重
针对元素较多的集合,用字典预先存储每个ID对应的排序索引,兼顾可读性和性能:
var colIds = new List<int>() { 7, 1, 6, 2 }; var orderMap = colIds.Select((id, idx) => new { id, idx }) .ToDictionary(item => item.id, item => item.idx); var result = Columns.Where(c => orderMap.ContainsKey(c.ColumnId)) .ToList() .OrderBy(c => orderMap[c.ColumnId]); result.Dump();
内容的提问来源于stack exchange,提问作者Ashish Tripathi
相关产品推荐
相关产品推荐

