2012-10-10 24 views
1

我指望每天創建的用戶數如下:組和計數。簡化代碼

IEnumerable<DateTime> dates = GetAllDatesForPeriod(); 

var rows = context.Users 
    .Where(x => x.Created >= minDate && x.Created <= max.Date) 
    .GroupBy(x => new { Year = x.Created.Year, Month = x.Created.Month, Day = x.Created.Day }) 
    .Select(x => new { Year = x.Key.Year, Month = x.Key.Month, Day = x.Key.Day, Count = x.Count() }).ToList() 
    .Select(x => new DataModel { Date = new DateTime(x.Year, x.Month, x.Day), Users = x.Count }).ToList(); 

    rows.AddRange(dates.Where(x => !rows.Any(y => y.Date == x)).Select(x => new DataModel { Date = x, Users = 0 })); 

第二個選擇是因爲我不能創建在Ef中查詢日期時間。

的的AddRange是具有計數= 0

此代碼工作以填充缺少的日期。但是有沒有辦法簡化這個?

謝謝你, 米格爾

+0

這是EdmFunctions中的一些DateTime相關函數(http://msdn.microsoft.com/en-us/library/dd486743.aspx) - 你試過這些嗎?你可以在Linq查詢中使用它們 - 這裏是一個例子:http://stackoverflow.com/questions/12673792/datetime-adddays-entityframework – Pawel

+0

你好,是的,我試過了......但是我沒有能夠集結它工作。有時會有點混亂。在這種情況下,我真正想避免的是使用兩個選擇。一步不可能做到最後一個選擇和添加範圍的功能是什麼? –

回答

1

這裏是主查詢:

var rows = context.Users 
    .Where(x => x.Created >= minDate && x.Created <= max.Date) 
    .GroupBy(u => EntityFunctions.TruncateTime(u.Created)) 
    .Select(g => new DataModel { Date = g.Key, Count = g.Count() }).ToList(); 

之後,當你已經做了,你可以添加缺少的日期。

+0

我曾嘗試過,但後來在我的AddRange部分我無法擺脫錯誤:「最好的重載方法匹配'System.Collections.Generic.List .AddRange(System.Collections.Generic .IEnumerable )'有一些無效的參數 –

+0

好吧,忘了'DataModel',請參閱我的編輯。 –