如何使用 EF Core 按周 对数据分组?
生活随笔
收集整理的這篇文章主要介紹了
如何使用 EF Core 按周 对数据分组?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
Aza:
在 Entity Framework 6 中,我可以用 SqlFunctions.DatePart() 函數來實現,參考如下代碼:
var?byWeek?=?data.GroupBy(x?=>?SqlFunctions.DatePart("week",?x.Date));現在的問題是, Entity Framework Core 中不提供如 DbFunctions 和 SqlFunctions 方法,這就很尷尬了,請問我該如何解決呢?
回答區
cyptus
既然沒有現成的函數,可以自己實現一個,將 sql 中的 datepart 方法用 C# 中的 DbFunctionAttribute 給標注上,這樣做的好處是告訴 efcore 不要去以 string 方式處理 detepart 參數,參考代碼如下:
DbContext:
public?int??DatePart(string?datePartArg,?DateTime??date)?=>?throw?new?Exception();public?void?OnModelCreating(DbModelBuilder?modelBuilder) {var?methodInfo?=?typeof(DbContext).GetRuntimeMethod(nameof(DatePart),?new[]?{?typeof(string),?typeof(DateTime)?});modelBuilder.HasDbFunction(methodInfo).HasTranslation(args?=>?new?SqlFunctionExpression(nameof(DatePart),?typeof(int?),?new[]{new?SqlFragmentExpression(args.ToArray()[0].ToString()),?args.ToArray()[1]})); }查詢方式:
repository.GroupBy(x?=>?dbContext.DatePart("week",?x.CreatedAt));更多信息參考 github:https://github.com/aspnet/EntityFrameworkCore/issues/10404
Nikolay Kostov:
確實有些麻煩,我現在的變通方法是除7實現,首先自定義個方法,代碼如下:
private?DateTime?GetFirstMondayOfYear(int?year) {var?dt?=?new?DateTime(year,?1,?1);while?(dt.DayOfWeek?!=?DayOfWeek.Monday){dt?=?dt.AddDays(1);}return?dt; }然后在分組的時候計算。
var?firstMondayOfYear?=?this.GetFirstMondayOfYear(DateTime.Now.Year);var?entries?=?this.entitiesService.FindForLastMonths(this.CurrentUser.Id,?6).GroupBy(x?=>?((int)(x.Date?-?firstMondayOfYear).TotalDays?/?7))這個分組會得到當前年的周個數,負值是表示掛在前一年的, 之后就可以通過下面的屬性方法得到當前的周名稱。
public?string?WeekName {get{var?year?=?DateTime.Now.AddYears((int)Math.Floor(this.WeekNumber?/?52.0)).Year;var?weekNumber?=?this.WeekNumber?%?52;while?(weekNumber?<?0){weekNumber?+=?52;}return?$"{year},?W{weekNumber}";} }點評區
sql處理稍微復雜一點,用ef處理起來還是有些麻煩的,沒啥好說的,學習了。
總結
以上是生活随笔為你收集整理的如何使用 EF Core 按周 对数据分组?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dapr牵手.NET学习笔记:状态管理进
- 下一篇: Dapr闪电说 - Dapr落地云原生架