2011-11-20 14 views
5

ho questa domanda che conta il numero totale di + 1 di un utente ha fatto sul nostro sito web:Linq per restituire record che non hanno un record di follow-up

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

dati proviene da questa tabella:

enter image description here

Un semplice conteggio di URL distinti dove IsOn = true mostrerà il conteggio delle pagine hanno fatto +1. Tuttavia, la tabella memorizza anche quando non-più1 qualcosa, memorizzando il valore in IsOn come falso.

Se io:

  • Più uno homepage
  • Unplus una homepage

non dovrebbe contare questo come un plus per l'utente nella nostra query come l'ultima azione per questo URL per questo utente era quello non più 1. Allo stesso modo, se io:

  • Più uno homepage
  • Unplus una homepage
  • Più uno homepage
  • Unplus una homepage
  • Più uno homepage

E ' dovrebbe contare questo nella query originale poiché l'ultima azione per quell'URL era quella più 1.

Come posso modificare la mia query per contare le istanze in cui IsOn è true e quella era l'ultima azione conosciuta per quell'utente per quell'URL? Sto faticando a scrivere una query che faccia questo.

risposta

4

Prova questo:

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

Bel segno di soluzione - +1 dal mio lato ... –

+0

Molto bello, grazie! –

2

Suona come si potrebbe fare qualcosa di simile:

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

Questo funzionerebbe se stai cercando solo l'ultimo voto (in contrapposizione al saldo dei voti) ... –

1

senza fare ipotesi su ciò che l'equilibrio per un massimo/downvotes potrebbe essere:

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); 

Questo prende in considerazione tutti i voti precedenti, piuttosto che guardare solo all'ultimo record. È, naturalmente, da te, ciò che preferisci.

Problemi correlati