2012-02-22 49 views
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(); 

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

回答

18

这应该做到这一点;

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

不错。我怀疑最后一部分实际上应该是'x => x.Received',但我喜欢这种处理空结果的方式。 – 2012-02-22 21:49:07

+0

@Joachim Isaksson - 我喜欢这个解决方案。我需要为.Any添加另一个条件(x => x.Received ==“Y”&& x => x。司==“会计”),但它不让我这样做。任何想法为什么。请注意,该分区不在上表中。我忘了包括它 – 2012-02-22 22:20:52

+0

@NatePet你只需要在lambda包含'x =>',所以它应该是'.Any(x => x.Received ==“Y”&& x.Division ==“Accounting “)' – 2012-02-23 05:48:09

3

你需要告诉它你想要什么Max的。

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

而且你不需要.Any()在所有

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"); 
6

不幸的是LINQ不提供方法“的属性最大值”。 MoreLINQ使用它的MaxBy运算符,但当然不能转换为SQL。所以如果这是一个LINQ to SQL(或其他)查​​询,那么你需要一种不同的方法。如果它已经LINQ到对象,但是:

return db.Exp.Where(rs => rs.ID == id) 
      .MaxBy(rs => rs.Amt) 
      .Received; 

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

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

这是一样:

  • 出的使用收到是真实的给定ID的记录...
  • 找到一个具有最高金额

还要注意如果有没有记录与这个ID,这将抛出异常。

如果你想这样做的LINQ到SQL等,你可能是最好与排序:

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

想,如果你使用LINQ做到这一点对象“,因为它会对所有结果进行排序,当您只想查找最高金额的结果时。

+0

乔恩,你会怎么做在c#linq上面? (从rs在db ....) – 2012-02-22 21:47:01

+0

@NatePet:你的意思是在查询表达式?哪一段代码?基本上没有'FirstOrDefault()'的查询表达式支持(显然不适用于'MaxBy'),所以你必须在查询表达式中放置括号来调用方法 - 并且你的投影将是一个否定的-OP。基本上这将是丑陋的。 *绝对值得使用这两种形式。 – 2012-02-22 21:48:39