2011-11-20 87 views
5

我有這樣的查詢計數+ 1的總數量是一個用戶在我們網站上發了言:LINQ到返回沒有跟進記錄記錄

return db.tblGPlusOneClicks 
    .Where(c => 
     c.UserID == UserID 
     && c.IsOn 
     ) 
    .Select(c=>c.URLID) 
    .Distinct() 
    .Count(); 

從本表數據來源:

enter image description here

不同網址的簡單計數,其中IsOn = true會顯示他們有+1的網頁數。但是,表格還會在存儲空間時存儲某些值,將IsOn中的值存儲爲false。

如果我:

  • 另外一個我的主頁
  • Unplus一個我的主頁

應該不算這是對我們的查詢用戶作爲​​最後一個動作加分這個用戶的這個URL是un-plus 1它。同樣,如果我:

  • 另外一個我的主頁
  • Unplus一個我的主頁
  • 另外一個我的主頁
  • Unplus一個我的主頁
  • 另外一個我的主頁

它應該在原始查詢中對此進行計數,因爲該URL的最後一個操作是加1。

如何修改我的查詢來計算IsOntrue的情況並且這是該用戶對該URL的最後一次已知操作?我努力編寫一個這樣的查詢。

回答

4

試試這個:

return db.tblGPlusOneClicks 
    .Where(c => c.UserID == UserID) 
    .GroupBy(c => c.URLID) 
    .Count(g => g.OrderByDescending(c => c.Date).First().IsOn); 
+0

不錯的解決方案標誌 - +1從我身邊... –

+0

非常好,謝謝! –

2

聽起來像是你可以做這樣的事情:

return (from c in db.tblGPlusOneClicks 
     where c.UserID == UserID 
     group c by c.URLID into g 
     where g.OrderByDescending(x => x.Date).First().IsOn 
     select g.Key).Distinct().Count(); 
+0

如果您只是在尋找最後一票(相對於票數的平衡),這將起作用... –

1

製作什麼的天平/ downvotes可能是沒有假設:

return db.tblGPlusOneClicks 
    .Where(c => c.UserID == UserID) 
    .GroupBy(c=>c.URLID) 
    .Select(g => new { 
      URLID = g.Key, 
      VoteBalance = g.Aggregate(0, (a,i) => a+(i.IsOn?1:-1)) 
    }) 
    .Sum(u => u.VoteBalance); 

這將所有以前的選票考慮在內,而不是隻看最新的記錄。當然,這取決於你,你喜歡什麼。