Linq从记录列表中获取最大值

时间:2012-02-22 22:36:23

标签: linq

我有下表

ID Amt  Received  SchoolAmt
-- ---- --------  -------
2  55   N          
2  88   Y          7
2  44   N          6  
3  5    N
3  9    N
4  5    N          32
5  33   Y
6  43   N
7  54   N          66

对于给定的ID,我需要找到Max Amount,然后检查它是否标记为Y,如果是,则将结果标记为布尔值为false。

这样做的一种方法是:

    db.Exp.
    Where(x => x.ID == id)
    .OrderByDescending(x => x.Amt)
    .Take(1)
    .Any(x => x.Received == "Y"); 

有效但我还需要补充一点,SchoolAmt也应该大于0。

为什么以下不起作用:

    db.Exp.
    Where(x => x.ID == id)
    .OrderByDescending(x => x.Amt)
    .Take(1)
    .Any(x => x.Received == "Y" && x => x.SchoolAmt > 0);

当我尝试输入x => x.SchoolAmt> 0 Visual Studio不允许它,因为它似乎是不正确的syntex。

3 个答案:

答案 0 :(得分:1)

尝试

.Any(x => x.Received == "Y" && x.SchoolAmt > 0);

答案 1 :(得分:0)

谓词应写成:

.Any(x => x.Received == "Y" && x.SchoolAmt > 0);

这是一个单一的委托,它被映射到一个类似于:

的函数
static bool someCompilerGeneratedName(YourClass x)
{
    return x.Received == "Y" && x.SchoolAmt > 0; 
}

由于这是一个单独的委托和单个方法,因此您只需要在开头创建lambda的=>。两个标准检查使用相同的变量(x)。

答案 2 :(得分:0)

我建议通过Nuget添加MoreLinq库,这将为您提供MaxBy / MinBy扩展,然后使用以下

 db.Exp.
    Where(x => x.ID == id)
    .MaxBy(x => x.Amt)
    .Any(x => x.Received == "Y" && x.SchoolAmt > 0);