首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在实体框架中GroupBy周在PostgreSQL中

问如何在实体框架中GroupBy周在PostgreSQL中
EN

Stack Overflow用户
提问于 2022-03-14 10:00:28
回答 2查看 162关注 0票数 2

我有一张有列DateTime的桌子。我想把这个按周分组。按日期或月份分组没有问题。但如何按周分组呢?

我需要这样的东西。in应该与IQueryable一起工作。

代码语言:javascript
复制
var peoplePerWeeks = await context.People
                                  .GroupBy(x => x.Date.StartOfWeek)
                                  .Select(x => new { Date = x.key, Number = x.Count()})
                                  .ToListAsync();
EN

回答 2

Stack Overflow用户

发布于 2022-08-26 07:45:22

我没有尝试在EF 6中也这样做,但这对我来说一直适用于使用EF Core:

在DataContext类中定义如下新方法:

代码语言:javascript
复制
public DateTimeOffset DatePart(string datePart, DateOnly date) => throw new Exception();

请注意,该方法的date参数的类型应该与您要分组的日期列的类型相匹配。不要担心异常抛出-实体框架会为您重写该方法,您提供的方法的实际实现并不重要。

然后继续按照如下方式在您的OnModelCreating中重写DataContext方法(如果您已经覆盖它来定义您的模式,那么只需将以下代码添加到它中):

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{            
    modelBuilder
        .HasDbFunction(typeof(DataContext).GetMethod(nameof(DatePart)))
        .HasName("date_trunc");

}

现在您可以开始编写按周、月、年分组的查询.:

代码语言:javascript
复制
var peoplePerWeeks = await context.People
                                  .GroupBy(x => context.DatePart("week", x.Date))
                                  .Select(x => new { Date = x.key, Number = x.Count()})
                                  .ToListAsync();

请注意,分组键不是星期数,而是每周星期一的日期。如果您想要获得该日期的日历周号,可以在内存中计算它(例如使用ISOWeek类,这不会造成很大的开销,因为您仍然只从数据库中每周加载聚合数据),或者您可以向DataContext中添加第二个数据库函数,类似于您添加date_trunc函数的方式,但是使用date_part函数并将调用添加到您的选择中:

代码语言:javascript
复制
.Select(x => new { MondayOfWeek = x.Key, CalendarWeek = context.DatePart("week", x.Key), Number = x.Count()})
票数 0
EN

Stack Overflow用户

发布于 2022-03-14 11:42:14

试过类似的吗?(这只是我的示例数据,没有postgres或实体框架,请参阅最后说明,但您希望在周开始时分组)

代码语言:javascript
复制
var people = new List<(DateTime Date, string fullName)> {
    ( new DateTime(2022, 3, 1), "fred"),
    ( new DateTime(2022, 3, 2), "b"),
    ( new DateTime(2022, 3, 3), "c"),
    ( new DateTime(2022, 3, 4), "d"),
    ( new DateTime(2022, 3, 5), "e"),
    ( new DateTime(2022, 3, 9), "f")
  };

  var groupWeek = people.GroupBy(x => {
    var td = x.Date;
    while (td.DayOfWeek != System.DayOfWeek.Monday) td = td.AddDays(-1);
    return td;
  }).Select(x => new { WeekStart = x.Key, Count = x.Count(), dataList = x.ToList() });

  var myList = groupWeek.ToList();

我想,你提到的那个部分是

代码语言:javascript
复制
 people.GroupBy(x => {
    var td = x.Date;
    while (td.DayOfWeek != System.DayOfWeek.Monday) td = td.AddDays(-1);
    return td;
  })

每周的第一天就在那里,视情况而定

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71465884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档