【问题标题】:How to group by last week in linq如何在linq中按上周分组
【发布时间】:2013-09-26 12:29:22
【问题描述】:

我的数据库中有一个 picturelikes 表。对于每一个喜欢的新图片,都会创建一个表格行。我想按上周和图片对这些喜欢进行分组,这意味着上周一张图片的所有喜欢都应该累积并成为一个喜欢。然后我将能够按他们的计数对它们进行排序。

这是我的风景如画的桌子:

public partial class picturelike
{
    public int idpicturelike { get; set; }
    public int idpictures { get; set; }
    public int iduser { get; set; }
    public System.DateTime iddatetime { get; set; }
    public int iduserlikedby { get; set; }
    public int likenumber { get; set; }
}

到目前为止,我能够编写此代码,这是我使用 linq 的 web api 控制器代码。

  var combo = from p in db.picturelikes
                    group p by new {p.iddatetime, p.idpictures } into pgroup
                    let count = pgroup.Count()
                    orderby count descending
                    select new SortedDto
                    {
                        IdPictures=pgroup.FirstOrDefault().idpictures,
                        IdPictureLike = pgroup.FirstOrDefault().idpicturelike,
                        IdUser = pgroup.FirstOrDefault().iduser,
                        IdDatetime = pgroup.FirstOrDefault().iddatetime,
                        IdUserLikedBy = pgroup.FirstOrDefault().iduserlikedby,
                        LikeNumber = pgroup.FirstOrDefault().likenumber
                    };

        return combo;

那我还需要做什么,如何让这段代码工作,我卡在这里,我该怎么做?

【问题讨论】:

  • 您观察到的错误、结果、缺陷是什么?它是如何失败的?
  • 上周,和过去 7 天一样?
  • Gusdor,它只是按我不想要的匹配日期进行分组,我想按过去 7 天分组
  • 如果答案不能解决您所描述的问题,那么您的问题就是垃圾。考虑修改。
  • 我不太明白。 group on the last 7 days,你的意思是group on each dayonly for the last 7 days

标签: c# sql asp.net-mvc linq lambda


【解决方案1】:

您无法按过去 7 天分组。你必须先过滤(where),然后分组:

var pastDate= DateTime.Now.Date.AddDays(-7);    
var combo = from p in db.picturelikes
                    where p.iddatetime.Date > pastDate
                    group p by p.iddatetime.Date into pgroup
                    let count = pgroup.Count()
                    orderby count descending
                    select new SortedDto
                    {
                        IdPictures=pgroup.FirstOrDefault().idpictures,
                        IdPictureLike = pgroup.FirstOrDefault().idpicturelike,
                        IdUser = pgroup.FirstOrDefault().iduser,
                        IdDatetime = pgroup.FirstOrDefault().iddatetime,
                        IdUserLikedBy = pgroup.FirstOrDefault().iduserlikedby,
                        LikeNumber = pgroup.FirstOrDefault().likenumber
                    };

        return combo;

对这一行的解释:

where p.iddatetime.Date > DateTime.Now.Date.AddDays(-7)

Date 属性只是时间的日期部分。我们捕捉到午夜并按一周中的逻辑天数进行过滤,而不是按小时。这将为您提供更可口的结果,但您可以随意更改。

【讨论】:

  • Gusdor 不是问题,它在做它应该做的事情。我只想要这一行中添加的功能,它应该能够在上周进行 gropuby。
  • Gusdor 你能解释一下 p.iddatetime.Date > DateTime.Now.Date.AddDays(-1) 这一行
  • @Hmmmmmmmmmm -1 是一个错字(应该是 -7)。我已经修复了它并放入了一些 cmets。
  • 我收到此错误“LINQ to Entities 不支持指定的类型成员 'Date'。仅支持初始化程序、实体成员和实体导航属性。”,
  • LINQ-to-Entities 可以处理本地值,但不能处理本地表达式。您的代码将使用此微小更改: var pastDate= DateTime.Now.Date.AddDays(-7);并像这样制作: where p.iddatetime > pastDate
【解决方案2】:

要仅选择上周的行,您可以在 linq 语句中添加 where 子句,例如

where p.iddatetime > (DateTime.Today - TimeSpan.FromDays(7))

【讨论】:

  • 其中 p.iddatetime.Date >= DateTime.Now.Date.AddDays(-7).Date
  • 我收到此错误 LINQ to Entities 无法识别方法 'System.TimeSpan FromDays(Double)' 方法,并且此方法无法转换为存储表达式。",
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多