sqlquery raw query fromsql framework c# linq-to-sql

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);