EF Linq查询比较多行数据
我想创建一个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检索数据的日期时间 表名:余额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
字段: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只有一个测量值,该测量值将差值设置为等于最后一个(也是唯一的)测量值
这可能吗?这似乎很复杂?我想试试这样的东西
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;
}
如前所述,性能(例如使用字典)、代码可读性当然应该提高,但。。。就是这个主意 这是一个很好的解决方案,但我确实犯了一个错误。“差异”字段的计算方式应该稍有不同。我更新了原来的问题。这是一个很好的解决方案,但我确实犯了一个错误。“差异”字段的计算方式应该稍有不同。我更新了原来的问题。