2013-07-12 170 views
3

我正在嘗試使用C#和LINQ查詢數據庫中的日常活動用戶。我有一個SQL查詢,工作正常。它在4秒鐘內完成<。LINQ查詢太慢,等效SQL很好

我的表稱爲登錄,具有性質:(DATETIME)日期,(GUID)用戶ID等

SELECT CAST([DATE] AS DATE) Date , COUNT (DISTINCT USERID) DailyActives 
    FROM Logins 
    GROUP BY CAST([DATE] AS DATE) 
    ORDER BY CAST([DATE] AS DATE) 

,計數是記錄在當日的不同用戶。我的LINQ查詢給出了正確的答案,但非常慢(很多分鐘)。在這裏,我從一個特定月份

from rows in Logins 
where rows.Date.Month == 04 && rows.Date.Year == 2013 
group rows by rows.Date.Day into MyGroup 
orderby MyGroup.Key 
select new 
    { 
     LoginDate = MyGroup.Key, 
     Count = MyGroup.Select(u => u.UserId).Distinct().Count() 

    } 

測試後,它似乎像count語句選擇需要永遠當我必須選擇(U => u.UserId),因爲我覺得它有映射回列表UserId的。我怎樣才能更有效地編寫查詢?

任何幫助表示讚賞。謝謝!

+0

你試過PLINQ:http://msdn.microsoft.com/en-us/library/dd460688.aspx –

+0

@ Tim.Tang這聽起來像一個數據庫Linq查詢(L2SQL/L2EF),所以PLINQ不會幫助。 –

+0

它們並沒有完全相同,因爲你在SQL中沒有WHERE子句,因爲你正在分組(慢),所以你並沒有在那一天獲得。我會張貼我會這樣做的方式,你可以自由嘗試。 –

回答

1

我會做如下...

var UserCount = Logins.Where(x => x.Date = DateTime.Today) 
        .Select(x => x.UserId).Distinct().Count(); 

你當然也可以用替代爲準一天你想獲得的數天。

+0

謝謝!這轉換成高效的SQL,我可以簡單地遍歷一個月以獲得所有的日子。非常感激! – user2576723