EF Linq查询比较多行数据

EF Linq查询比较多行数据,linq,entity-framework,Linq,Entity Framework,我想创建一个Linq查询,比较单个表中多行的日期。 该表由轮询web服务以获取帐户余额数据的数据组成。不幸的是,轮询间隔不是100%确定的,这意味着每个帐户每天可以有0-1个以上的条目 对于应用程序,我需要将这些数据重新格式化为特定格式(请参见下面的“输出”)。 我包括了样本数据和表的描述 有人能帮我做一个EF Linq查询来生成所需的输出吗 表: id The account id balance The available credits in the accoun

我想创建一个Linq查询,比较单个表中多行的日期。 该表由轮询web服务以获取帐户余额数据的数据组成。不幸的是,轮询间隔不是100%确定的,这意味着每个帐户每天可以有0-1个以上的条目

对于应用程序,我需要将这些数据重新格式化为特定格式(请参见下面的“输出”)。 我包括了样本数据和表的描述

有人能帮我做一个EF Linq查询来生成所需的输出吗

表:

id The account id balance The available credits in the account at the time of the measurement create_date The datetime when the data was retrieved 帐户id 在测量时平衡账户中的可用信用 create_date检索数据的日期时间 表名:余额
字段:id(int)
字段:余额(bigint)
字段:创建日期(日期时间)

样本数据:

id balance create_date 3 40 2012-04-02 07:01:00.627 1 55 2012-04-02 13:41:50.427 2 9 2012-04-02 03:41:50.727 1 40 2012-04-02 16:21:50.027 1 49 2012-04-02 16:55:50.127 1 74 2012-04-02 23:41:50.627 1 90 2012-04-02 23:44:50.427 3 3 2012-04-02 23:51:50.827 3 -10 2012-04-03 07:01:00.627 1 0 2012-04-03 13:41:50.427 2 999 2012-04-03 03:41:50.727 1 50 2012-04-03 15:21:50.027 1 49 2012-04-03 16:55:50.127 1 74 2012-04-03 23:41:50.627 2 -10 2012-04-03 07:41:50.727 1 100 2012-04-03 23:44:50.427 3 0 2012-04-03 23:51:50.827 id余额创建日期 3 40 2012-04-02 07:01:00.627 1 55 2012-04-02 13:41:50.427 2 9 2012-04-02 03:41:50.727 1 40 2012-04-02 16:21:50.027 1 49 2012-04-02 16:55:50.127 1 74 2012-04-02 23:41:50.627 1 90 2012-04-02 23:44:50.427 3 3 2012-04-02 23:51:50.827 3 -10 2012-04-03 07:01:00.627 1 0 2012-04-03 13:41:50.427 2 999 2012-04-03 03:41:50.727 1 50 2012-04-03 15:21:50.027 1 49 2012-04-03 16:55:50.127 1 74 2012-04-03 23:41:50.627 2 -10 2012-04-03 07:41:50.727 1 100 2012-04-03 23:44:50.427 3 0 2012-04-03 23:51:50.827 预期输出:

id帐户id
日期用于生成行中日期的数据组件
余额\u上次测量值日期最后测量值的余额
差异日期的第一次测量和最后一次测量之间的差额

  • 在2012-04-02上,id 2只有一个测量值,该测量值将差值设置为等于最后一个(也是唯一的)测量值
id日期余额\上次\测量差异 1 2012-04-02 90 35 1 2012-04-03 100 10 2 2012-04-02 9 9 2 2012-04-03 -10 -19 3 2012-04-02 3 -37 3 2012-04-03 0 37 更新2012-04-10 20:06 Raphaël Althaus的回答非常好,但我在最初的请求中确实犯了一个小错误。“预期输出”中的差异字段应为:

  • 前一天最后测量值与当天最后测量值之间的差值
  • 如果没有前一天,则应使用当天的第一次测量,最后一次测量

  • 这可能吗?这似乎很复杂?

    我想试试这样的东西

    var query = db.Balances
                    .OrderBy(m => m.Id)
                    .ThenBy(m => m.CreationDate)
                    .GroupBy(m => new
                                      {
                                          id = m.Id,
                                          year = SqlFunctions.DatePart("mm", m.CreationDate),
                                          month = SqlFunctions.DatePart("dd", m.CreationDate),
                                          day = SqlFunctions.DatePart("yyyy", m.CreationDate)
                                      }).ToList()//enumerate there, this is what we need from db
                    .Select(g => new
                                     {
                                         id = g.Key.id,
                                         date = new DateTime(g.Key.year, g.Key.month, g.Key.day),
                                         last_balance = g.Select(m => m.BalanceValue).LastOrDefault(),
                                         difference = (g.Count() == 1 ? g.First().BalanceValue : g.Last().BalanceValue - g.First().BalanceValue)
                                     });    
    

    我想试试那样的东西

    var query = db.Balances
                    .OrderBy(m => m.Id)
                    .ThenBy(m => m.CreationDate)
                    .GroupBy(m => new
                                      {
                                          id = m.Id,
                                          year = SqlFunctions.DatePart("mm", m.CreationDate),
                                          month = SqlFunctions.DatePart("dd", m.CreationDate),
                                          day = SqlFunctions.DatePart("yyyy", m.CreationDate)
                                      }).ToList()//enumerate there, this is what we need from db
                    .Select(g => new
                                     {
                                         id = g.Key.id,
                                         date = new DateTime(g.Key.year, g.Key.month, g.Key.day),
                                         last_balance = g.Select(m => m.BalanceValue).LastOrDefault(),
                                         difference = (g.Count() == 1 ? g.First().BalanceValue : g.Last().BalanceValue - g.First().BalanceValue)
                                     });    
    

    很可能是一个未优化的解决方案,但看看它是否有效

    首先,我们创建一个结果类

    public class BalanceResult
        {
            public int Id { get; set; }
            public DateTime CreationDate { get; set; }
            public IList<int> BalanceResults { get; set; }
            public int Difference { get; set; }
    
            public int LastBalanecResultOfDay {get { return BalanceResults.Last(); }}
            public bool HasManyResults {get { return BalanceResults != null && BalanceResults.Count > 1; }}
            public int DailyDifference { get { return HasManyResults ? BalanceResults.Last() - BalanceResults.First() : BalanceResults.First(); } }
    
        }
    
    最后

    foreach (var balanceResult in balanceResults.ToList())
                {
                    var previousDayBalanceResult = balanceResults.FirstOrDefault(m => m.Id == balanceResult.Id && m.CreationDate == balanceResult.CreationDate.AddDays(-1));
                    balanceResult.Difference = previousDayBalanceResult != null ? balanceResult.LastBalanecResultOfDay - previousDayBalanceResult.LastBalanecResultOfDay : balanceResult.DailyDifference;
                }
    

    如前所述,性能(例如使用字典)、代码可读性当然应该提高,但。。。就是这个主意

    很可能是一个未优化的解决方案,但看看它是否有效

    首先,我们创建一个结果类

    public class BalanceResult
        {
            public int Id { get; set; }
            public DateTime CreationDate { get; set; }
            public IList<int> BalanceResults { get; set; }
            public int Difference { get; set; }
    
            public int LastBalanecResultOfDay {get { return BalanceResults.Last(); }}
            public bool HasManyResults {get { return BalanceResults != null && BalanceResults.Count > 1; }}
            public int DailyDifference { get { return HasManyResults ? BalanceResults.Last() - BalanceResults.First() : BalanceResults.First(); } }
    
        }
    
    最后

    foreach (var balanceResult in balanceResults.ToList())
                {
                    var previousDayBalanceResult = balanceResults.FirstOrDefault(m => m.Id == balanceResult.Id && m.CreationDate == balanceResult.CreationDate.AddDays(-1));
                    balanceResult.Difference = previousDayBalanceResult != null ? balanceResult.LastBalanecResultOfDay - previousDayBalanceResult.LastBalanecResultOfDay : balanceResult.DailyDifference;
                }
    

    如前所述,性能(例如使用字典)、代码可读性当然应该提高,但。。。就是这个主意

    这是一个很好的解决方案,但我确实犯了一个错误。“差异”字段的计算方式应该稍有不同。我更新了原来的问题。这是一个很好的解决方案,但我确实犯了一个错误。“差异”字段的计算方式应该稍有不同。我更新了原来的问题。