我有一张有列DateTime的桌子。我想把这个按周分组。按日期或月份分组没有问题。但如何按周分组呢?
我需要这样的东西。in应该与IQueryable一起工作。
var peoplePerWeeks = await context.People
.GroupBy(x => x.Date.StartOfWeek)
.Select(x => new { Date = x.key, Number = x.Count()})
.ToListAsync();发布于 2022-08-26 07:45:22
我没有尝试在EF 6中也这样做,但这对我来说一直适用于使用EF Core:
在DataContext类中定义如下新方法:
public DateTimeOffset DatePart(string datePart, DateOnly date) => throw new Exception();请注意,该方法的date参数的类型应该与您要分组的日期列的类型相匹配。不要担心异常抛出-实体框架会为您重写该方法,您提供的方法的实际实现并不重要。
然后继续按照如下方式在您的OnModelCreating中重写DataContext方法(如果您已经覆盖它来定义您的模式,那么只需将以下代码添加到它中):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.HasDbFunction(typeof(DataContext).GetMethod(nameof(DatePart)))
.HasName("date_trunc");
}现在您可以开始编写按周、月、年分组的查询.:
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函数并将调用添加到您的选择中:
.Select(x => new { MondayOfWeek = x.Key, CalendarWeek = context.DatePart("week", x.Key), Number = x.Count()})发布于 2022-03-14 11:42:14
试过类似的吗?(这只是我的示例数据,没有postgres或实体框架,请参阅最后说明,但您希望在周开始时分组)
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();我想,你提到的那个部分是
people.GroupBy(x => {
var td = x.Date;
while (td.DayOfWeek != System.DayOfWeek.Monday) td = td.AddDays(-1);
return td;
})每周的第一天就在那里,视情况而定
https://stackoverflow.com/questions/71465884
复制相似问题