Linq生成IEnumerable<object[]>时出现多余方括号问题求助
问题
数据库里的轨迹数据如下:
track_id, point_id, latd, lond A,1,12,100 A,2,13,101 B,1,10,90 B,2,13,90
我需要生成符合GeoJSON MultiLineString格式的IEnumerable<object[]>,目标结构是:
[[12, 100],[13, 101]], [[10, 90],[13, 90]]
试了这段C#代码:
var multiTrackList = _context.tracks .GroupBy(g => g.track_id) .Select(s => new object[] { _context.tracks .Where(w => w.track_id == s.Key) .OrderBy(o => o.track_id).ThenBy(o => o.date).ThenBy(o => o.time) .Select(e => new object[] { e.lond.Value, e.latd.Value }).ToList() });
但返回结果多了一层嵌套方括号,变成了:
[[[12, 100],[13, 101]]], [[[10, 90],[13, 90]]]
解决方案
问题根源
- 多套了一层数组:你在
Select里用new object[] { ... }把分组后的轨迹点列表又包了一层,本来每个分组的轨迹点已经是List<object[]>,套完就变成了object[]嵌套List<object[]>的结构,对应JSON就多了一层[]。 - N+1查询浪费性能:分组后又通过
_context.tracks.Where(...)重新查询数据库,完全没必要——分组后的IGrouping对象本身就包含当前组的所有数据。
修正后的代码
var multiTrackList = _context.tracks .GroupBy(g => g.track_id) .Select(s => s // 若point_id是按轨迹顺序生成的,用它排序更高效;需按时间排序则保留原有的date+time逻辑 .OrderBy(o => o.point_id) // 注意:GeoJSON标准是[经度,纬度],你的目标示例是[纬度,经度],按需调整顺序 .Select(e => new object[] { e.latd.Value, e.lond.Value }) .ToArray() // 直接转为object[],匹配需求的类型 );
关键修改说明
- 移除外层的
new object[] { ... }:直接返回分组内排序后的轨迹点数组,每个分组对应一个object[],最终multiTrackList就是IEnumerable<object[]>,正好符合MultiLineString的结构要求。 - 复用分组数据:用
IGrouping对象s直接访问当前组的所有轨迹点,避免重复查询数据库,提升性能。 - 排序灵活调整:如果业务必须按时间排序,把
OrderBy(o => o.point_id)替换为OrderBy(o => o.date).ThenBy(o => o.time)即可。 - 坐标顺序适配:GeoJSON官方标准要求先经度后纬度,如果你的业务需要保持目标示例的[纬度,经度]顺序,就保留当前的坐标顺序;若要符合标准,调整为
new object[] { e.lond.Value, e.latd.Value }。
内容的提问来源于Stack Exchange,提问作者Sylvain C.
相关产品推荐
相关产品推荐

