Вот тот, который я продолжаю работать:
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)
} ;
Я хотел бы к orderby один или несколько полей в избранной проекции.
Самым простым изменением, вероятно, является использование продолжения запроса:
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;
Это в основном эквивалентно использованию «let», если честно - реальная разница в том, что let вводит новая переменная диапазона, тогда как продолжение запроса эффективно запускает новую область переменных диапазона - например, вы не можете ссылаться на grp
внутри бита после в выделении
.
Стоит отметить, что это в точности то же самое, что и использование двух операторов:
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;
заключить весь запрос в круглые скобки, а
.OrderBy(x => x.FailedCount).ThenBy(x => x.CancelCount);
Вы можете переместить значение select в назначение let, а затем построить заказ после этого.
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;
;