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)”参数列表。