我有一个具有以下结构的数据表(显示一个员工的示例数据):
Employee Date PayRate
--------------------------------
123 1/1/2015 15.00
123 1/1/2014 14.50
123 1/1/2013 14.00
我需要能够使用"截至"日期来选择给定任何给定日期的工资率。所以如果我输入emp# 123和1/5/2014,我应该得到14.50美元。如果我输入emp# 123和7/8/2013,我应该得到14.00美元,如果我使用emp# 123和今天的日期,我应该得到15.00美元,以此类推。
我知道如何在纯SQL中做到这一点,但我在纯System.Data.DataTable中做到这一点的方法卡住了。我离开开发有一段时间了,从来没有学会使用LINQ(我怀疑用LINQ很容易做到)。
我想到了循环遍历表的方法,直到我找到第一个日期小于我的"截至"日期匹配雇员#的记录,但这似乎是一个非常不优雅的方式来处理这个问题。
我也想过用
DataTable.Select("Date > #" + AsOfDate.ToString("MM/dd/yyyy") + "#", "AsOfDate");
获取DataRow[]数组,如果返回的行数超过0,则选择第一个值,但这似乎也是一种hack。
目前的标准/最佳实践/推荐方法是什么?
如果有关系,我使用。net 4.5
按日期降序排序,查找数据小于参考日期的第一行:
DataTable.AsEnumerable()
.Where(r => r.Field<int>("Employee") == 123)
.OrderByDescending (r => r.Field<DateTime>("Date"))
.FirstOrDefault (r => r.Field<DateTime>("Date") < new DateTime(2013, 7, 8) )