2009-03-12 9 views
2

J'ai une table comme ça ...LINQ - Valeur de retour Du champ avec un maximum de valeur si aucune ligne trouvée

ID Description LowThreshold HighThreshold 
1 BAD   0.0   .69 
2 MEETS  .70   .89 
3 GOOD   .90   2 

L'objet est ici pour écrire une requête LINQ qui sélectionnera le droit Description basée sur une décimale donnée. Par exemple .75 est entre .70 et .89, donc il retournerait "MEETS". MAIS, le kicker est, si le nombre est supérieur à toutes les plages, retourner automatiquement la description de l'enregistrement avec le plus élevé HighThreshold. Donc, si je passe à 5, je devrais obtenir "BON" retourné.

J'ai ce jusqu'à présent, mais il des erreurs sur les scores plus élevés que 2, évidemment:

private string GetEvaluationDescription (decimal score) 
{ 
     string evaluationText = myContext.PerformanceRanges.Where 
         (e => 
           e.LowThreshold <= score 
           && 
           e.HighThreshold >= score 
         ) 
         .Select(eval => eval.Description).First().ToString(); 
} 

Je voudrais accomplir ceci avec juste cette requête, mais mon imagination ne me reçois Là. Je tentais ce que je trouvais dans this après mais n'a pas pu le faire fonctionner

Répondre

2

Qu'en est-ce:

var range = myContext.PerformanceRanges 
      .SingleOrDefault(e=>e.LowThreshold <= score && e.HighThreshold >= score)?? 
      PerformanceRanges.Single(
             e=>e.HighThreshold == PerformanceRanges 
                  .Max(p=> p.HighThreshold) 
            ); 

string evaluationText = range.Description; 

La requête range sélectionnera l'élément correspond aux plages de Thereshold, et si la valeur est supérieure (la première requête renverra null), elle sélectionnera la plus grande plage.

1

Qu'en est-ce:

string evaluationText = myContext.PerformanceRanges.Where 
        (e => 
          (e.LowThreshold <= score 
          && 
          e.HighThreshold >= score) || 
         (e.HighThreshold == 
          myContext.PerformanceRanges.Max (
            x => x.HighThreshold) 
          && score > e.HighThreshold) 
        ) 
        .Select(eval => eval.Description).First().ToString(); 
Questions connexes