Linq возвращает записи, которые не имеют последующей записи - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть этот запрос, который подсчитывает общее количество +1, сделанных пользователем на нашем сайте:

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

Данные получены из этой таблицы:

enter image description here

Простое количество отдельных URL, где IsOn = true будет показывать количество страниц, которые у них есть + 1.Тем не менее, таблица также сохраняет, когда они что-то плюс-1, сохраняя значение в IsOn как false.

Если I:

  • Плюс одна моя домашняя страница
  • Отключить одну мою домашнюю страницу

Это не должно расцениваться как плюс для этого пользователя в нашем запросе, так как последнее действие для этого URL для этого пользователя было убрать 1 плюс.Аналогично, если я:

  • Плюс одна моя домашняя страница
  • Отключу одну мою домашнюю страницу
  • Плюс одну мою домашнюю страницу
  • Отключу одну мою домашнюю страницу
  • Плюс одна моя домашняя страница

Это должно учитываться в исходном запросе, так как последнее действие для этого URL было плюс 1.

Как я могу изменить свой запросподсчитать случаи, когда IsOn равно true и это было последнее известное действие для этого пользователя для этого URL?Я изо всех сил пытаюсь написать запрос, который делает это.

Ответы [ 3 ]

4 голосов
/ 21 ноября 2011

Попробуйте это:

return db.tblGPlusOneClicks
    .Where(c => c.UserID == UserID)
    .GroupBy(c => c.URLID)
    .Count(g => g.OrderByDescending(c => c.Date).First().IsOn);
2 голосов
/ 21 ноября 2011

Похоже, вы могли бы сделать что-то вроде этого:

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();
1 голос
/ 21 ноября 2011

Не делая предположений о том, каким может быть баланс для повышения / понижения голосов:

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

Здесь учитываются все предыдущие голоса, а не просто последняя запись.Разумеется, вам решать, что вы предпочитаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...