2010-02-18 37 views
2

這是我第一次真實世界的LINQ-to-SQL查詢。我想知道我是否犯了大的,明顯的錯誤。這是LINQ查詢有效寫入的平均和小時分組嗎?

我有一個大中型(2M +記錄,每天增加13k)表與數據,dataTypeID,machineID和dateStamp。我想在4小時內從所有機器和特定數據類型中獲取數據的平均值,最小值和最大值,並追溯到28天。

E.g

日期時間                       平均     民     最大
1/1/10 12:00 AM     74.2     72.1     75 0.7
1/1/10上午4點    74.5     73.1     76.2
1/1/10 08:00 AM     73.7     71.5     74.2
1/1/10 12:00 PM     73.2     71.2     76.1
等。
1/28/10 12:00 AM     73.1     71.3     75.5

到目前爲止,我只能夠組平均1倍小時的增量,但我很可能與處理,如果該方案過於凌亂。

代碼:

var q = 
    from d in DataPointTable 
    where d.dateStamp > DateTime.Now.AddDays(-28) && (d.dataTypeID == (int)dataType + 1) 
    group d by new { 
     d.dateStamp.Year, 
     d.dateStamp.Month, 
     d.dateStamp.Day, 
     d.dateStamp.Hour 
    } into groupedData 
    orderby groupedData.Key.Year, groupedData.Key.Month, groupedData.Key.Day, groupedData.Key.Hour ascending 
    select new { 
     date = Convert.ToDateTime(
      groupedData.Key.Year.ToString() + "-" + 
      groupedData.Key.Month.ToString() + "-" + 
      groupedData.Key.Day.ToString() + " " + 
      groupedData.Key.Hour.ToString() + ":00" 
      ), 
     avg = groupedData.Average(d => d.data), 
     max = groupedData.Max(d => d.data), 
     min = groupedData.Min(d => d.data) 
    }; 

回答

3

如果你想4個小時增量除以4小時創造了新的datetime元素時(使用整數除法),然後乘以4。請注意,您可以簡單地使用需要年,月,日,小時,分鐘和秒的構造函數,而不是構造字符串並將其轉換。

var q = 
    from d in DataPointTable 
    where d.dateStamp > DateTime.Now.AddDays(-28) && (d.dataTypeID == (int)dataType + 1) 
    group d by new { 
     d.dateStamp.Year, 
     d.dateStamp.Month, 
     d.dateStamp.Day, 
     Hour = d.dateStamp.Hour/4 
    } into groupedData 
    orderby groupedData.Key.Year, groupedData.Key.Month, groupedData.Key.Day, groupedData.Key.Hour ascending 
    select new { 
     date = new DateTime(
      groupedData.Key.Year, 
      groupedData.Key.Month, 
      groupedData.Key.Day, 
      (groupedData.Key.Hour * 4), 
      0, 0), 
     avg = groupedData.Average(d => d.data), 
     max = groupedData.Max(d => d.data), 
     min = groupedData.Min(d => d.data) 
    }; 

爲了提高你可能要考慮在dateStamp列添加索引效率。鑑於你只選擇了可能的小範圍的日期,使用索引應該是一個顯着的優勢。我希望查詢計劃能夠爲第一個日期進行索引查找,使其更快。

+0

+1爲'dateStamp'上的索引+1 – 2010-02-18 19:05:27

+0

感謝您的建議。 我曾試過「d.dateStamp.Hour/4」,但它不合法。 VS2008說:「無效的匿名類型成員聲明。匿名類型成員必須聲明與成員分配,簡單名稱或成員訪問。」 – PHiZiX 2010-02-19 00:20:42

+0

對不起 - 它需要一個名字... – tvanfosson 2010-02-19 02:42:08