【问题标题】:How to select only the records with the highest date in LINQ如何仅选择 LINQ 中日期最高的记录
【发布时间】:2009-01-22 19:16:12
【问题描述】:

我有一个表“lasttraces”,其中包含以下字段。

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 中仅获取每个 AccountId(日期最高的那个)的最后一个 lasttrace?

【问题讨论】:

  • 实际上,在您的示例中,所有具有相同帐户 ID 的日志都具有完全相同的日期,那么在这种情况下哪个优先?

标签: c# .net linq linq-to-sql


【解决方案1】:

如果您只想要每个帐户的最后日期,您可以使用:

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();

【讨论】:

  • Oracle 不支持这个。如果您不考虑查询性能,您可以在执行查询之前将表转换为 ToList。
  • 如果您可以为此发布method-chain 解决方案,那就太好了。
  • 第二个查询——不应该是(from n in table ...).First()吗?
  • @JasonL,没有。 First() 调用应适用于 g.Order... 表达式(子查询)。
  • @Mehrdad Afshari 太棒了,我主要想要第二个,但它们现在都在我的 sn-ps 中,因为非常有用。谢谢谢谢谢谢!!!!!!
【解决方案2】:

这是一个简单的方法

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

也看看这个很棒的 LINQ 地方 - LINQ to SQL Samples

【讨论】:

  • 如果您查询每个帐户但不执行 OP 所述的操作,则此解决方案可以正常工作,即在不提供 AccountId(在您的情况下为 PlayerId)的情况下获取所有记录的最新结果
  • 这个解决方案启发我订购而不是尝试选择最大值。 +1
  • 这个解决方案可能会导致 Linq 出现“Sequence contains no elements”错误,对吧?
【解决方案3】:

如果你想要整条记录,这里有一个 lambda 方式:

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

【讨论】:

  • 工作得很好。谢谢。
  • 这是这里的关键。
【解决方案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) };

【讨论】:

    【解决方案5】:

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

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

    • 级别(数字)
    • Url(网站的 URL)

    转到存储在 ArrayList 对象上的站点列表。并执行以下查询以按级别降序对其进行排序。

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

    将集合按降序排序后,我编写了以下代码来获取作为第一行出现的对象

    MyClass topObject = query.FirstRow<MyClass>()
    

    这很有魅力。

    【讨论】:

    • 这给了我一个比我原来的想法更好的想法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多