2010-04-09 71 views
2

我有一個充滿時間點和實驗值的數據庫表。我需要檢索實驗的值並創建一個顯示其數據的XY圖的縮略圖圖像。由於每個實驗的實際數據集可能爲100,000個數據點,而我的圖像只有100個像素寬,因此我想通過每隔n個時間點對圖像進行採樣並忽略其餘部分。如何從LINQ to SQL的時間序列中抽取數據?

我當前的查詢(其檢索所有數據,而無需採樣)是簡單的東西是這樣的:

var points = from p in db.DataPoints 
      where p.ExperimentId == myExperimentId 
      orderby p.Time 
      select new { 
          X = p.Time, 
          Y = p.Value 
         } 

所以,我怎樣才能最好的從我的結果每n個點的LINQ設置爲SQL查詢?

回答

3

這樣做的每第n個元素:

int nth = 100; 
var points = db.DataPoints 
      .Where(p => p.ExperimentId == myExperimentId) 
      .OrderBy(p => p.Time) 
      .Where((p, index) => index % nth == 0) 
      .Select(p => new { X = p.Time, Y = p.Value }); 

它通過使用Queryable.Where過載,其序列中提供索引,這樣你就可以基於關閉索引過濾器。

+0

+1爲重載的地方。 – 2010-04-09 16:38:37

+0

謝謝!這個想法似乎很好。 – 2010-04-09 20:33:37

1
.Skip(n).Take(1) 

將返回一個採樣點。多次調用以獲得更多積分。

http://msdn.microsoft.com/en-us/library/bb386988.aspx

如果性能成爲一個問題,你必須包含連續的值,你可以嘗試返回,將平均分配您的n個主鍵中的所有記錄類型爲int的主標識鍵。

.Where(x => x.PK % n == 0) 
+0

這並不是每一個第N點,儘管... – 2010-04-09 16:29:48

+0

@ Reed:它確實如果你反覆調用它。 – 2010-04-09 16:30:55

+0

哎喲 - 一次拿一個點,整個序列?這是苛刻:) – 2010-04-09 16:34:41

-1

您應

.Skip(n).Take(100) 

它跳過你希望它跳過和每一條記錄多少需要100條記錄。

HTH

+0

這將跳過n條記錄,並採取下100個連續的記錄。 – 2010-04-09 16:26:01

+0

這不是每個第N個點,但... – 2010-04-09 16:30:23