Entity Framework多表连接后如何按Cidade分组去重并返回指定四列
解决方案
你需要先对查询结果按城市分组,再做聚合取值即可实现按城市去重,同时返回全部四列,修改后的代码如下:
var cidadesMaisFrias = (from a in _contexto.Cidades join b in _contexto.Estados on a.EstadoId equals b.Id join d in _contexto.PrevisaoClimas on a.Id equals d.CidadeId where d.DataPrevisao >= DateTime.Parse("23/11/2021") && d.DataPrevisao <= DateTime.Parse("29/11/2021") // 按城市+州分组,同一城市归属唯一州,不会出现分组冲突 group new { d.TemperaturaMinima, d.TemperaturaMaxima } by new { a.Nome, b.Uf } into g select new { Cidade = g.Key.Nome, Estado = g.Key.Uf, // 取该城市查询周期内的最低温,可根据业务调整聚合规则 TemperaturaMinima = g.Min(x => x.TemperaturaMinima), // 取该城市查询周期内的最高温,可根据业务调整聚合规则 TemperaturaMaxima = g.Max(x => x.TemperaturaMaxima) }) // 分组后排序取前3个最冷城市 .OrderBy(x => x.TemperaturaMinima) .Take(3) .ToList();
注意事项
- 如果你的业务需求是取该城市在查询周期内任意一天的气温记录,而非周期内的温度极值,可以将select部分替换为以下写法,取分组内第一条符合排序要求的记录即可:
select new { Cidade = g.Key.Nome, Estado = g.Key.Uf, TemperaturaMinima = g.OrderBy(x => x.TemperaturaMinima).First().TemperaturaMinima, TemperaturaMaxima = g.OrderBy(x => x.TemperaturaMinima).First().TemperaturaMaxima }
- 原代码中的排序逻辑放在分组前,分组后排序规则会失效,因此调整到分组之后执行,保证最终返回结果符合你预期的按最低温升序取前3的需求。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

