Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq从记录列表中获取最大值_Linq - Fatal编程技术网

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

Linq从记录列表中获取最大值,linq,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,我需要找到最大数量,然后检查它是否标记为Y,如果是,则将结果标记为布

我有下表

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,我需要找到最大数量,然后检查它是否标记为Y,如果是,则将结果标记为布尔值true或false

一种方法是:

    db.Exp.
    Where(x => x.ID == id)
    .OrderByDescending(x => x.Amt)
    .Take(1)
    .Any(x => x.Received == "Y"); 
这是可行的,但我还需要添加schoolmat也应该大于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.schoolmat>0时,Visual studio不允许这样做,因为它似乎是不正确的syntex。

谓词应写成:

.Any(x => x.Received == "Y" && x.SchoolAmt > 0);
这是一个委托,它被映射到一个函数,该函数看起来类似于:

static bool someCompilerGeneratedName(YourClass x)
{
    return x.Received == "Y" && x.SchoolAmt > 0; 
}
因为这是一个委托和一个方法,所以在开始创建lambda时只需要其中的
=>
。这两个条件检查使用相同的变量(x)。

请尝试

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

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

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

我如何知道何时使用&x.schoolmat>0与我所拥有的相比。也就是说,我在where子句中看到了类似于x=>x.Received==“Y”&&x=>x.schoolmat>0的内容before@Nate“x=>”正在生成lambda表达式。它基本上是让编译器为您创建一个方法。“x”是方法的参数,之后的所有内容都包含在方法体中。每个谓词(在开头)只使用一次。@NatePet编译器将我答案中的第一个代码块转换为类似于第二个的代码块——“x=>”映射到它为您生成的方法的“(YourClass x)”参数列表。