【问题标题】:Linq to return records that don't have a follow up recordLinq 返回没有后续记录的记录
【发布时间】:2012-01-02 13:51:40
【问题描述】:

我有一个查询用户在我们网站上的 +1 总数:

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

数据来源于此表:

不同 URL 的简单计数,IsOn = true 将显示它们 +1 的页面计数。但是,当他们取消加 1 时,表也会存储,方法是将 IsOn 中的值存储为 false。

如果我:

  • 加一个我的主页
  • 我的主页加一个

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

  • 加一个我的主页
  • 我的主页加一个
  • 加一个我的主页
  • 我的主页加一个
  • 加一个我的主页

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

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

【问题讨论】:

    标签: c# asp.net linq lambda


    【解决方案1】:

    不对赞成/反对票的余额做出任何假设:

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

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

    【讨论】:

      【解决方案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();
      

      【讨论】:

      • 如果您只寻找最后一张选票(而不是选票余额),这将起作用...
      【解决方案3】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多