如何解决Linq尝试在groupBy之后使用Include
我在带有EF的.net中有一个Api,并且frontEnd需要以特定的方式获取json。 最初我尝试使用以下代码:
[HttpGet("getTrafos")]
public IEnumerable<object> GetTrafos(){
var resultado =_context.Transformadores.OrderBy(z=>z.Anio).ThenBy(z=>z.Mes).ThenBy(x=>x.Prioridad)
.Include(t => t.Etapa).ThenInclude(x=>x.IdColorNavigation)
.Include(f=>f.Etapa).ThenInclude(x=>x.EtapaEmpleado)
.ToList();
List<Object> array = new List<Object>();
foreach(var result in resultado){
result.Etapa=result.Etapa.OrderBy(m=>m.IdTipoEtapa).ToList();
var mes = AsignarMes(resultado[0].Mes);
var obj=new {group = $"{mes} de {resultado[0].Anio}"};
var ultimoAnio=resultado[0].Anio;
var ultimoMes=mes;
array.Add(obj);
foreach(var trafo in resultado)
{
mes=this.AsignarMes(trafo.Mes);
if(trafo.Anio!=ultimoAnio)
{
obj=new {group = $"{mes} de {resultado[0].Anio}"};
array.Add(obj);
array.Add(trafo);
}
else{
if(mes!=ultimoMes)
{
obj=new{group=$"{mes} de {trafo.Anio}"};
array.Add(obj);
}
array.Add(trafo);
}
ultimoAnio=trafo.Anio;
ultimoMes=mes;
}
}
return array;
}
AsignarMes方法:
private string AsignarMes(int? mes){
var map = new Dictionary<int,string>()
{
{1,"Enero"},{2,"Febrero"},{3,"Marzo"},{4,"Abril"},{5,"Mayo"},{6,"Junio"},{7,"Julio"},{8,"Agosto"},{9,"Septiembre"},{10,"Octubre"},{11,"Noviembre"},{12,"Diciembre"}
};
string output;
return map.TryGetValue(mes.GetValueOrDefault(),out output) ? output : "";
}
但是出于性能原因(将内容下载到前端大约需要13秒),我尝试了另一种方法:
var resultado =_context.Transformadores.OrderBy(z=>z.Anio).ThenBy(z=>z.Mes).ThenBy(x=>x.Prioridad)
.GroupBy(x=> new { x.Anio,x.Mes },(key,group) => new
{
Anio = key.Anio,Mes = key.Mes,Trafos = group.ToList()
});
List<Object> array = new List<Object>();
foreach (var result in resultado) {
foreach (var trafo in result.Trafos)
{
trafo.Etapa = trafo.Etapa.OrderBy(m => m.IdTipoEtapa).ToList();
}
var mesEnLetras = this.AsignarMes(result.Mes);
var obj = new {group = $"{mesEnLetras} de {result.Anio}"};
array.Add(obj);
array.AddRange(result.Trafos);
}
return array;
使用最后的代码性能更好,但是问题是我不能包含 Etapa , IdColorNavigation 和 EtapaEmpleado 。 还有另一种方法吗?
多谢指教!
这些是模型:
using System;
using System.Collections.Generic;
namespace Foha.Models
{
public partial class Transformadores
{
public Transformadores()
{
Etapa = new HashSet<Etapa>();
}
public int IdTransfo { get; set; }
public string OPe { get; set; }
public int? OTe { get; set; }
public string Observaciones { get; set; }
public int RangoInicio { get; set; }
public int RangoFin { get; set; }
public int? IdCliente { get; set; }
public string NombreCli { get; set; }
public int Potencia { get; set; }
public int? IdTipoTransfo { get; set; }
public DateTime? FechaCreacion { get; set; }
public int? Mes { get; set; }
public int? Anio { get; set; }
public int? Prioridad { get; set; }
public virtual Cliente IdClienteNavigation { get; set; }
public virtual TipoTransfo IdTipoTransfoNavigation { get; set; }
public virtual ICollection<Etapa> Etapa { get; set; }
}
}
using System;
using System.Collections.Generic;
namespace Foha.Models
{
public partial class Etapa
{
public Etapa()
{
EtapaEmpleado = new HashSet<EtapaEmpleado>();
}
public int IdEtapa { get; set; }
public int? IdTipoEtapa { get; set; }
public DateTime? DateIni { get; set; }
public DateTime? DateFin { get; set; }
public bool? IsEnded { get; set; }
public string TiempoParc { get; set; }
public string TiempoFin { get; set; }
public int? IdTransfo { get; set; }
public string IdEmpleado { get; set; }
public string Hora { get; set; }
public DateTime? InicioProceso { get; set; }
public int? IdColor { get; set; }
public int? NumEtapa { get; set; }
public virtual Colores IdColorNavigation { get; set; }
public virtual TipoEtapa IdTipoEtapaNavigation { get; set; }
public virtual Transformadores IdTransfoNavigation { get; set; }
public virtual ICollection<EtapaEmpleado> EtapaEmpleado { get; set; }
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。