2012-02-22 74 views
2

列表获取最大我有以下表的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如果是这样,标记结果为布尔true为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。

回答

0

谓语应该写成:

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

这是一个代表,它被映射到一个函数,看起来类似于:

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

因为这是一个代表,和一个单一的方法,你只需要在那里的=>开始创建lambda。两个标准检查使用相同的变量(x)。

+0

我怎么知道什么时候使用&& X .SchoolAmt> 0与我所拥有的。意思是,我看到过类似于x => x.Received ==“Y”&& x => x.SchoolAmt> 0,用于 – 2012-02-22 22:40:15

+0

之前的where子句@Nate“x =>”正在制作一个lambda表达式。这基本上是让编译器为你创建一个方法。 “x”是方法的参数,之后的所有内容都是方法体中包含的内容。每个谓词只能使用一次(在开始处)。 – 2012-02-22 22:47:26

+0

@NatePet编译器将我的答案中的第一个代码块变成类似于第二个代码块 - “x =>”被映射到它为您制作的方法的“(YourClass x)”参数列表。 – 2012-02-22 22:48:20

1

尝试

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

我建议增加通过的NuGet的MoreLinq库这会给你的MaxBy/MinBy扩展,然后使用以下

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