LINQ从列表中获取最大值

时间:2012-02-22 21:27:07

标签: 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();

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

4 个答案:

答案 0 :(得分:18)

这应该这样做;

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

答案 1 :(得分: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;

请注意,这是在做你问题的单词

  • 具有给定ID的记录......
  • 找到金额最高的那个......
  • 并检查Received
  • 的值

与:

相同
  • 带有给定ID的记录中收到的内容为真......
  • 找出金额最高的

另请注意,如果 no 记录中包含该ID,则会引发异常。

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

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

如果您正在使用LINQ to Objects,想要这样做,因为当您只想查找具有最高金额的结果时,它会对所有结果进行排序。

答案 2 :(得分:3)

你需要告诉它你想要的Max

var result = 
    (from rs in db.Exp 
    where rs.ID == id && rs.Received
    select rs)
   .Max(row => row.Amt) == Y;

您根本不需要.Any()

答案 3 :(得分:0)

// "I need to find the max Amt for a given id..."
var elementWithMaxAmount = 
    db.Exp
    .Where(x => x.ID == id)
    .OrderByDescending(x => x.Amount)
    .FirstOrDefault();

// "... and then check if it is Y"
var result = (elementWithMaxAmount != null && 
              elementWithMaxAmount.Received == "Y");