2011-11-20 10 views
5

tengo esta consulta que cuenta el número total de +1 en un usuario ha hecho en nuestra página web:LINQ para devolver registros que no tienen un registro de seguimiento

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

datos origina a partir de esta tabla:

enter image description here

Un simple recuento de URL diferentes, donde IsOn = true mostrará el recuento de páginas que tienen +1. Sin embargo, la tabla también almacena cuando des-más1 algo, almacenando el valor en IsOn como falso.

Si yo:

  • Más uno como página de inicio
  • Unplus una página de inicio

No debería contar esto como una ventaja para ese usuario en nuestra consulta como la última acción para esta URL para este usuario era un-plus 1. Del mismo modo, si:

  • Más uno como página de inicio
  • Unplus una página de inicio
  • Más uno como página de inicio
  • Unplus una página de inicio
  • Más uno como página de inicio

Se debería contar esto en la consulta original ya que la última acción para esa URL era más 1.

¿Cómo puedo modificar mi consulta para contar las instancias en las que IsOn es y esa fue la última acción conocida para ese usuario para esa URL? Estoy luchando por escribir una consulta que haga esto.

Respuesta

4

Prueba esto:

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

Buena solución marca - +1 de mi lado ... –

+0

Muy bien, gracias! –

2

suena como usted podría hacer algo como esto:

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

Esto funcionaría si está buscando solo la última votación (a diferencia del saldo de votos) ... –

1

Sin hacer suposiciones acerca de lo/downvotes podría ser el equilibrio hasta:

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

Esto tiene en cuenta todos los votos anteriores, en lugar de mirar solo el último registro. Es, por supuesto, depende de ti, lo que prefieres.

Cuestiones relacionadas