LINQ从列表中获取最大值

Nat*_*Pet 6 linq

我有下表:

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

    var result = (from rs in db.Exp
                  where rs.ID == id
                  && rs.Received == true
                  select rs).Max().Any();
Run Code Online (Sandbox Code Playgroud)

给定一个ID,我需要找到给定id的最大Amt,然后检查它是否为Y,如果是,则返回true,否则返回false.

Joa*_*son 18

这应该做到;

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


Jon*_*eet 6

不幸的是,LINQ没有提供"max by a attribute"方法.MoreLINQ与其MaxBy运算符一起使用,但当然不能将其转换为SQL.因此,如果这是一个LINQ to SQL(或其他)查​​询,您将需要一个不同的方法.但是,如果它已经是LINQ to Objects,那么:

return db.Exp.Where(rs => rs.ID == id)
             .MaxBy(rs => rs.Amt)
             .Received;
Run Code Online (Sandbox Code Playgroud)

请注意,这是做什么的你的问题问:

  • 具有给定ID的记录中...
  • 找到数量最多的那个......
  • 并检查值 Received

这是一样的:

  • 具有给定ID的记录中收到的是真实的...
  • 找到金额最高的那个

另请注意,如果没有包含该ID的记录,则会抛出异常.

如果你想在LINQ to SQL等中做到这一点,你可能最好订购:

var highest = db.Exp.Where(rs => rs.ID == id)
                    .OrderByDescending(rs => rs.Amt)
                    .FirstOrDefault();
return highest != null && highest.Received;
Run Code Online (Sandbox Code Playgroud)

希望如果你正在使用LINQ to对象,因为它会命令所有的结果,当你只是想找到的最高金额,结果做到这一点.