Linq order by aggregate in the select { }

后端 未结 3 739
青春惊慌失措
青春惊慌失措 2021-01-04 02:27

Here is one I am working on:

var fStep =
            from insp in sq.Inspections
            where insp.TestTimeStamp > dStartTime && insp.TestTim         


        
相关标签:
3条回答
  • 2021-01-04 03:15

    You can move the select value to a let assignment and then build an order by after that.

    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;
    ;
    
    0 讨论(0)
  • 2021-01-04 03:16

    The simplest change is probably to use a query continuation:

    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;
    

    That's mostly equivalent to using "let", to be honest - the real difference is that let introduces a new range variable, whereas a query continuation effectively starts a new scope of range variables - you couldn't refer to grp within the bit after into selection for example.

    It's worth noting that this is exactly the same as using two statements:

    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;
    
    0 讨论(0)
  • 2021-01-04 03:26

    wrap the whole query in parentheses and

    .OrderBy(x => x.FailedCount).ThenBy(x => x.CancelCount);
    
    0 讨论(0)
提交回复
热议问题