如何在上周分组在linq

时间:2013-09-26 12:29:22

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

我的数据库中有一张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;

那么我需要做什么,如何使这段代码正常工作,我被困在这里,我应该怎么做?

2 个答案:

答案 0 :(得分:2)

您不能在过去七天内分组。您必须先过滤(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属性只是时间的日期组件。我们捕捉到午夜并按照一周的逻辑日过滤,而不是按小时过滤。这会给你更好的结果,但随时可以改变它。

答案 1 :(得分:0)

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

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