2010-03-31 9 views
14

Aquí es uno que estoy trabajando en:fin LINQ por agregada en el selecto {}

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 orderBy uno o más de los campos en la proyección de selección.

Respuesta

16

El cambio más sencilla 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; 

Eso es mayormente equivalente a usar "dejar", para ser honesto - la diferencia real es que le permiten introduce un nueva gama variable, mientras que una continuación de consulta inicia efectivamente un nuevo ámbito de variables de rango; no puede referirse a grp dentro del bit después de into selection por ejemplo.

Vale la pena señalar que este es exactamente lo mismo que usar dos declaraciones:

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

Funciona bien –

+0

esto es muy bueno. buen trabajo, jon –

4

envolver toda la consulta entre paréntesis y

.OrderBy(x => x.FailedCount).ThenBy(x => x.CancelCount); 
+1

El segundo '' OrderBy' debe ser ThenBy'. –

+0

por favor muestre el ejemplo –

+0

Muy simple. Gracias David. – mack

1

se puede mover el valor de selección a una asignación de let y luego construir una orden después de eso.

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

Se ha producido un error al ejecutar: No se puede ordenar por tipo '<> f__AnonymousType6'2 [System.Int32, System.Int32]'. –

+0

descarta 'nuevo ...' y reemplázalo con 'orderby newInsp.FailedCount, newInsp.CancelCount' –

+0

Gracias Thomas ... Nunca intenté ejecutarlo (solo tenía un modelo de datos falsificado para asegurarte de que al menos se compiló). –