LINQ - 如果没有找到行,则返回具有最大值的字段的值

时间:2009-03-12 23:14:33

标签: linq

我有一张这样的桌子......

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

这里的对象是编写一个LINQ查询,它将根据给定的小数选择正确的描述。例如.75介于.70和.89之间,因此它将返回“MEETS”。但是,如果数字高于所有范围,则踢球者会自动返回具有最高HighThreshold的记录的描述。所以,如果我传入5,我应该返回“GOOD”。

到目前为止,我有这个,但它的分数高于2,显然是错误的:

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

我想用这一个查询完成这个,但我的想象力并没有让我在那里。我试图在this帖子中找到但是无法让它工作

2 个答案:

答案 0 :(得分:2)

这个怎么样:

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;

range查询将选择与阈值范围匹配的元素,如果值更大(第一个查询将返回null),它将选择最大范围。

答案 1 :(得分:1)

这个怎么样:

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