C# 使用LINQ计算每小时燃油消耗量

C# 使用LINQ计算每小时燃油消耗量,c#,linq,C#,Linq,我有一个日期时间和值表。该值是datetime时储罐的体积。我想计算一下在过去10天里,每小时油箱的填充/清空量 我每15分钟测量一次油箱,但将来可能每20分钟测量一次。我试图用LINQ计算它 我所做的是: allDataView.RowFilter = String.Format(CultureInfo.InvariantCulture.DateTimeFormat, "DateOfData < #{0}# AND DateOfData > #{1}#", DateTime

我有一个日期时间和值表。该值是datetime时储罐的体积。我想计算一下在过去10天里,每小时油箱的填充/清空量

我每15分钟测量一次油箱,但将来可能每20分钟测量一次。我试图用LINQ计算它

我所做的是:

allDataView.RowFilter = String.Format(CultureInfo.InvariantCulture.DateTimeFormat,
    "DateOfData < #{0}# AND DateOfData > #{1}#", DateTime.Now, DateTime.Now.AddDays((-1) * daysInterval));

allDataView.Sort = "DateOfData DESC";

// making the diff between every sample during the last daysInterval days and put it into a list with these differences.
var result = allDataView.Table.AsEnumerable().Zip(allDataView.Table.AsEnumerable().Skip(1), (row1, row2) => Convert.ToDouble(row1["Value"])-Convert.ToDouble(row2["Value"]));
然后我想取11:00 3中的最新值,取10:00 0.5中的最后一个值,然后将其插入列表中,并在该时间段内继续

我想用Linq来做。感谢您对如何实施它的任何帮助


非常感谢。

我建议创建一个sp来处理日期时间值的分组。这应该有一个额外的好处,即允许您的查询运行得更快,然后您应该能够通过linq更快地提取结果。

我想我做到了:

var groups = from row in allDataView.Table.AsEnumerable()
                         group row by new { Convert.ToDateTime(row["DateOfData"]).Hour, Convert.ToDateTime(row["DateOfData"]).Date } into g
                         select new
                         {
                             FirstDate = g.First()["DateOfData"],
                             FirstValue = g.First()["Value"],
                             LastDate = g.Last()["DateOfData"],
                             LastValue = g.Last()["Value"]
                         };


            var result = groups.Select(grp => Convert.ToDouble(grp.FirstValue) - Convert.ToDouble(grp.LastValue));

业务逻辑不应该在数据库中实现。此外,BL应在源安全中。干杯,但是我建议在sql server中选择一个简单的组,然后在Linq中完成额外的功能,sql server将比Linq运行得更快。
var groups = from row in allDataView.Table.AsEnumerable()
                         group row by new { Convert.ToDateTime(row["DateOfData"]).Hour, Convert.ToDateTime(row["DateOfData"]).Date } into g
                         select new
                         {
                             FirstDate = g.First()["DateOfData"],
                             FirstValue = g.First()["Value"],
                             LastDate = g.Last()["DateOfData"],
                             LastValue = g.Last()["Value"]
                         };


            var result = groups.Select(grp => Convert.ToDouble(grp.FirstValue) - Convert.ToDouble(grp.LastValue));