2009-01-22 138 views
90

我有一个表'lasttraces',其中包含以下字段。如何仅选择LINQ中具有最高日期的记录

Id, AccountId, Version, DownloadNo, Date 

的数据是这样的:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000 
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000 
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000 
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000 
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000 
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000 

我怎样才能在LINQ to SQL,只有让每一个帐户ID(具有最高日)的最后lasttrace?

+0

实际上在你的例子中所有具有相同帐号的日志都有完全相同的日期,那么哪一个在这种情况下优先? – BlackTigerX 2009-01-22 20:05:15

回答

188

如果你只是想为每个帐户的最后一天,你会使用这样的:

var q = from n in table 
     group n by n.AccountId into g 
     select new {AccountId = g.Key, Date = g.Max(t=>t.Date)}; 

如果你想整个纪录:

var q = from n in table 
     group n by n.AccountId into g 
     select g.OrderByDescending(t=>t.Date).FirstOrDefault(); 
+0

hhaa。你在哪里更快;) – 2009-01-22 19:39:33

+2

Oracle不支持这一点。如果查询性能超出您的考虑范围,则可以在执行查询之前转换表ToList。 – 2013-03-08 09:44:41

+4

如果您可以为此发布一个“方法链”解决方案,那将会很棒。 – Lijo 2013-05-28 12:07:44

4

这可能是这样的:

var qry = from t in db.Lasttraces 
      group t by t.AccountId into g 
      orderby t.Date 
      select new { g.AccountId, Date = g.Max(e => e.Date) }; 
3

去一个简单的方法来做到这一点: -

创建一个类来保存以下信息

  • 水平(数)
  • 网址(网站地址)

去存储一个ArrayList对象上的站点列表。并按以下查询执行,按Level降序排序。

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object 

一旦我在降序排序集,我写了下面的代码来获取当属最上面一行

MyClass topObject = query.FirstRow<MyClass>() 

这工作就像魅力的对象。

31

这里有一个简单的方法来做到这一点

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands 
           .Where(c => c.PlayerID == player.ID) 
           .OrderByDescending(t=>t.CreationTime) 
           .FirstOrDefault(); 

也可以看看这个伟大的LINQ的地方 - LINQ to SQL Samples

9

如果你想整个纪录,这里是一个lambda方式:

var q = _context 
      .lasttraces 
      .GroupBy(s => s.AccountId) 
      .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault()); 
相关问题