2013-12-19 62 views
2

的trendData是使用當前UTC日期爲結束日期和當前UTC日期的開始日期事件日誌時列表-13(數據庫保存日期,UTC)拆分過去兩週的數據爲當前和前一週

DateTime dUtcEnd = DateTime.UtcNow.Date; 
DateTime dUtcStart = dUtcEnd.AddDays(-13); 

var trendData = (from e in db.EventLogs 
       where e.EventDateTime >= dUtcStart && e.EventDateTime <= dUtcEnd 
         && e.EventType == 'some event' 
       select e).ToList(); 

有沒有辦法在一週增量TakeSkip以填充數組值當前和前幾個星期?

沿着這些線?不知怎的,我想象TakeSkip需要它的基礎上EventDateTime,以便確定了被認爲是當前和前幾個星期。

var currentTrend = trendData.Take(7).Reverse(); 
var previousTrend = trendData.Skip(7).Take(7).Reverse(); 

爲了給一些進一步的情況下到什麼是試圖完成,下面是Highcharts陣列將如何填充的想法。

返回的結果將包含3個陣列。

WeeklyTrend results = new WeeklyTrend(); 
results.Categories = new string[7]; 
results.ThisWeek = new int[7]; 
results.LastWeek = new int[7]; 

填入Today類型的類別,每次當前星期減少一天。

int dayCounter = 6; 
for (int i = 0; i < 7; i++) 
{ 
    results.Categories[i] = dUtcEnd.AddDays(-dayCounter).ToShortDateString(); 
    dayCounter--; 
} 

查看Categories數組以查找EventDateTime與數組中的日期相匹配的數組值。

foreach (var cTrend in currentTrend) 
{ 
    var dayOfWeek = Array.FindIndex(results.Categories, c => c.Contains(cTrend.EventDateTime.ToShortDateString())); 

    results.ThisWeek[dayOfWeek]++; 
} 

看類別陣列,以尋找到EventDateTime與添加到當前周比賽日數組中的日期相匹配的數組值..

foreach (var pTrend in previousTrend) 
{ 
    var dayOfWeek = Array.FindIndex(results.Categories, c => c.Contains(pTrend.EventDateTime.AddDays(6).ToShortDateString())); 

    results.LastWeek[dayOfWeek]++; 
} 

的最終目標是填充一張Highcharts趨勢圖表,顯示本週與前一週相比的數據。

enter image description here

回答

1

我的傾向是在您的linq中使用GroupBy。考慮到這一點,我做了一個快速谷歌,並提出了一些在這裏。一個吸引我的眼睛卻是這樣一句:

C# Linq or Lambda expression Group by Week IEnumerable list with date field

基本上,套用它:

DateTime dUtcEnd = DateTime.UtcNow.Date; 
DateTime dUtcStart = dUtcEnd.AddDays(-13); 

var eventLogs = new List<EventLogs>(); 

var weekTrendGroups = eventLogs 
    .Where(x => x.EventDateTime >= dUtcStart 
       && x.EventDateTime <= dUtcEnd 
       && x.EventType == "some event") 
    .Select(p => new 
    { 
     Event = p, 
     Year = p.EventDateTime.Year, 
     Week = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear 
       (p.EventDateTime, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) 
    }) 
    .GroupBy(x => new { x.Year, x.Week }) 
    .Select((g, i) => new 
    { 
     WeekGroup = g, 
     WeekNum = i + 1, 
     Year = g.Key.Year, 
     CalendarWeek = g.Key.Week 
    }); 

foreach (var eventLogGroup in weekTrendGroups) 
{ 
    Console.WriteLine("Week " + eventLogGroup.WeekNum); 
    foreach (var proj in eventLogGroup.WeekGroup) 
     Console.WriteLine("{0} {1} {2}", 
      proj.Event.EventType, 
      proj.Event.EventDateTime.ToString("d"), 
      proj.Event.Id); 
} 

[編輯] - 固定的功能,以配合您的數據屬性。

所以,這裏的數據是整齊周DayOfWeek.Monday在這種情況下,邊界上切碎。你當然可以改變以適應。然後你就可以參加WeekNum和派對。

這看起來像一個整潔的解決方案,你可以的話當然適用於你自己的謂詞給它切它,你認爲合適。

+0

謝謝你。有一點需要注意的是,LINQ不喜歡'CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(p.EventDateTime,CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Sunday)',所以最初的查詢獲取數據需要首先在內存中。像這樣'var first = db.EventLogs.Where(x => x.EventDateTime> = dUtcStart && x.EventDateTime <= dUtcEnd && x.EventType ==「some event」)。ToList();'。從帖子http://stackoverflow.com/a/11261467/1040188找到答案 – iamchrisfryer

0

「不知怎的,我想象,採取和Skip需要它的基礎上EventDateTime,以便確定了被認爲是當前和前幾個星期。」

你只是在找這個?

var previousTrend = trendData.OrderBy(e => e.EventDateTime).Take(7).Reverse(); 
var currentTrend = trendData.OrderBy(e => e.EventDateTime).Skip(7).Take(7).Reverse(); 
+0

我在找的是能夠將trendData的前7天放入currentTrend中,並將這7天前一天放入previousTrend。使用當前的代碼,它只會選擇前7個和最後7個記錄。 – iamchrisfryer

+0

@iamchrisfryer我不明白天和記錄之間的不同。你能解釋一下嗎? – Harrison

+0

對不起。我的錯。我一直在尋找的是能夠從2周的數據以第7天,然後跳過,並從相同的數據集,從2週數據的取得的第二個星期再以7天。 Take(7)as只返回7條記錄。我認爲Take(7)需要在EventDateTime.Days上才能返回7天的數據,但我不知道如何。 – iamchrisfryer