2013-10-10 51 views
1

我有一個日期時間表和值的表。該值是日期時間內的一個容器的體積。我想計算在過去10天內每小時內儲罐的填充量/清空量。使用LINQ計算小時燃料消耗

我每隔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"])); 

但這些都是每次測量之間的差異。我想要的是在該日期內計算各個時段樣本之間的差異。

例如:

9:50 0.5 
10:05 1 
10:20 2 
10:35 2.5 
10:50 3 
11:05 5 

比我要帶那是在11:00的最新值(3),並採取最後的值是10點(0.5),並插入3 -0.5 = 2.5到列表並在該時間段內繼續。

我想用Linq來做。感謝任何幫助如何實施它。

非常感謝。

回答

-1

我建議創建一個sp來處理日期時間值的分組。這應該有額外的好處,讓您的查詢運行更快,你shoukld然後能夠通過linq更快地拉出結果。

+0

好奇至於原因downvote? – DrewbieDoo

+0

業務邏輯不應該在DataBase中實現。另外BL應該是源安全的。 [分離關注](http://en.wikipedia.org/wiki/Separation_of_concerns) – mecek

+0

乾杯,但是我建議在sql server中簡單選擇組,然後在Linq中完成額外的功能,SQL Server運行速度比LINQ快能夠。 – DrewbieDoo

0

我想我做到了:

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