2008-10-01 82 views

回答

76
 using (DataContext dc = new DataContext()) 
     { 
      var q = from t in dc.TableTests 
        group t by t.SerialNumber 
         into g 
         select new 
         { 
          SerialNumber = g.Key, 
          uid = (from t2 in g select t2.uid).Max() 
         }; 
     } 
+1

我想接受这两个答案,但我想我不能所以我投票给你们两个。感谢BUNCH !!! – 2008-10-01 16:33:27

58
var q = from s in db.Serials 
     group s by s.Serial_Number into g 
     select new {Serial_Number = g.Key, MaxUid = g.Max(s => s.uid) } 
+0

我想接受这两个答案,但我想我不能,所以我投票给你们两个。 感谢BUNCH !!! – 2008-10-01 15:08:21

+0

另请注意,Max函数中的=> lambda表达式的变量可以是任何值(s => s.uid,tv => tv.uid,asdf => asdf.uid)。 Linq会自动将它识别为选择Serial类型的元素。 – Michael 2011-03-17 17:03:45

21

我检查DamienG在LinqPad答案。相反

g.Group.Max(s => s.uid) 

g.Max(s => s.uid) 

谢谢!

+1

upvoted for more extra effort in checking this – Michael 2011-03-17 16:44:43

11

在方法链形式:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new 
    { 
     Serial_Number = g.Key, 
     uid = g.Max(row => row.uid) 
    }); 
5

的答案是确定的,如果你只需要这两个领域,但对于更复杂的对象,也许这种方法可能是有用的:

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid) 
.FirstOrDefault() 

。 ..这将避免“选择新的”