2011-11-20 20 views
5

mam tej kwerendy, że liczy się jako całkowitą liczbę + 1 użytkownik dokonał na naszej stronie internetowej:LINQ aby wrócić rekordy, które nie mają kontynuacji rekord

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

Dane pochodzą z tej tabeli:

enter image description here

prosty liczba różnych adresów URL, gdzie IsOn = true pokaże liczbę stron oni dali +1. Jednak tabela przechowuje również, gdy są one un-plus1 coś, zapisując wartość w IsOn jako false.

Gdybym:

  • Plus jedna moja strona
  • Unplus jedna moja strona

Nie należy liczyć to jako plus dla tego użytkownika w naszym zapytaniu jako ostatni działania dla ten adres URL dla tego użytkownika to un-plus 1 go. Podobnie, jeśli:

  • Plus jedna moja strona
  • Unplus jedna moja strona
  • Plus jedna moja strona
  • Unplus jedna moja strona
  • Plus jedna moja strona

It powinien policzyć to w pierwotnym zapytaniu, ponieważ ostatnią akcją dla tego adresu URL było dodanie 1.

Jak mogę zmodyfikować moje zapytanie, aby policzyć wystąpienia, w których IsOn jest true i która była ostatnią znaną akcją dla tego użytkownika dla tego adresu URL? Próbuję napisać zapytanie, które to robi.

Odpowiedz

4

Spróbuj tego:

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

Znak ładny rozwiązanie - +1 z mojej strony ... –

+0

Bardzo ładne, dziękuję! –

2

Brzmi jak można zrobić coś takiego:

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

To zadziała, jeśli szukasz tylko ostatniego głosowania (w przeciwieństwie do salda głosów) ... –

1

Making żadnych założeń co bilans na górę/downvotes mogą być:

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

To bierze pod uwagę wszystkie poprzednie głosy, zamiast patrzeć tylko na ostatni rekord. To zależy od ciebie, co wolisz.

Powiązane problemy