在DataTable中通过截止日期查找行

时间:2015-05-14 21:31:15

标签: c# linq datatable

我有一个具有以下结构的DataTable(显示一名员工的样本数据):

Employee    Date        PayRate
--------------------------------
123         1/1/2015    15.00
123         1/1/2014    14.50
123         1/1/2013    14.00

我需要能够使用" As Of"在任何给定日期选择支付率的日期。所以如果我通过emp#123和1/5/2014,我应该得到$ 14.50。如果我通过emp#123和7/8/2013,我应该得到14.00美元,如果我使用emp#123和今天的日期,我应该得到15.00美元,依此类推。

我知道如何在纯SQL中执行此操作,但我坚持在纯System.Data.DataTable中执行此操作的方法。我已经缺乏开发一段时间了,从来没有学会使用LINQ(我怀疑它在LINQ中很容易做到)。

我想到了循环遍历表格的方法,直到找到第一条记录的日期小于我的" As-of"与员工#匹配的日期,但这似乎是处理这种情况的一种非常不优雅的方式。

我还想过使用

DataTable.Select("Date > #" + AsOfDate.ToString("MM/dd/yyyy") + "#", "AsOfDate");

获取DataRow []数组,并选择第一个值,如果它返回的行数超过零,但这看起来也像是一个黑客。

这些天的标准/最佳做法/推荐方法是什么?

如果重要,我使用的是.NET 4.5

1 个答案:

答案 0 :(得分:2)

按日期按降序对行进行排序,找到第一个数据小于参考日期的行:

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