Linq返回没有后续记录的记录

时间:2011-11-20 22:56:44

标签: c# asp.net linq lambda

我有这个查询,计算用户在我们网站上的总数+:

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,该表还会存储非加1的内容。

如果我:

  • 加上我的主页
  • Unplus one my homepage

在我们的查询中,不应将此计为该用户的加号,因为此用户的此URL的最后一个操作是取消加1。同样,如果我:

  • 加上我的主页
  • Unplus one my homepage
  • 加上我的主页
  • Unplus one my homepage
  • 加上我的主页

它应该在原始查询中计算,因为该URL的最后一个操作是加1。

如何修改我的查询以计算IsOntrue的实例,这是该用户对该网址的最后一次已知操作?我正在努力编写一个执行此操作的查询。

3 个答案:

答案 0 :(得分:4)

试试这个:

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

答案 1 :(得分: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();

答案 2 :(得分:1)

不假设up / 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);

这会考虑所有以前的投票,而不是只看最新的记录。当然,这取决于你,你喜欢什么。