c# - raw - sql query ef core
Linq orden por agregado en la selección{} (3)
Aquí hay uno en el que estoy trabajando:
var fStep =
from insp in sq.Inspections
where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
&& insp.Model == "EP" && insp.TestResults != "P"
group insp by new { insp.TestResults, insp.FailStep } into grp
select new
{
FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
grp.Key.TestResults,
grp.Key.FailStep,
PercentFailed = Convert.ToDecimal(1.0 * grp.Count() /tcount*100)
} ;
Me gustaría ordenar por uno o más de los campos en la proyección seleccionada.
El cambio más simple es probablemente usar una continuación de consulta:
var fStep =
from insp in sq.Inspections
where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
&& insp.Model == "EP" && insp.TestResults != "P"
group insp by new { insp.TestResults, insp.FailStep } into grp
select new
{
FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
grp.Key.TestResults,
grp.Key.FailStep,
PercentFailed = Convert.ToDecimal(1.0 * grp.Count() /tcount*100)
} into selection
orderby selection.FailedCount, selection.CancelCount
select selection;
Para ser honesto, la mayoría de las veces es equivalente a usar "let". La diferencia real es que permite introducir una nueva variable de rango, mientras que la continuación de una consulta inicia efectivamente un nuevo alcance de variables de rango. into selection
por ejemplo.
Vale la pena señalar que esto es exactamente lo mismo que usar dos afirmaciones:
var unordered =
from insp in sq.Inspections
where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
&& insp.Model == "EP" && insp.TestResults != "P"
group insp by new { insp.TestResults, insp.FailStep } into grp
select new
{
FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
grp.Key.TestResults,
grp.Key.FailStep,
PercentFailed = Convert.ToDecimal(1.0 * grp.Count() /tcount*100)
};
var fStep = from selection in unordered
orderby selection.FailedCount, selection.CancelCount
select selection;
Puede mover el valor de selección a una asignación de let y luego construir una orden.
var fStep =
from insp in sq.Inspections
where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
&& insp.Model == "EP" && insp.TestResults != "P"
group insp by new { insp.TestResults, insp.FailStep } into grp
let newInsp = new
{
FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
grp.Key.TestResults,
grp.Key.FailStep,
PercentFailed = Convert.ToDecimal(1.0 * grp.Count() / tcount * 100)
}
orderby newInsp.FailedCount, newInsp.CancelCount
// or this ...
//orderby newInsp.FailedCount
//orderby newInsp.CancelCount
select newInsp;
;
envolver toda la consulta entre paréntesis y
.OrderBy(x => x.FailedCount).ThenBy(x => x.CancelCount);