如何使用 EF Core 按周 对数据分组?

咨询区

  • Aza

在 Entity Framework 6 中,我可以用 SqlFunctions.DatePart() 函数来实现,参考如下代码:

var byWeek = data.GroupBy(x => SqlFunctions.DatePart("week", x.Date));

现在的问题是, Entity Framework Core 中不提供如 DbFunctionsSqlFunctions 方法,这就很尴尬了,请问我该如何解决呢?

回答区

  • 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处理起来还是有些麻烦的,没啥好说的,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忍着疼痛奔跑,带着泪光微笑!

忍着疼痛奔跑&#xff0c;带着泪光微笑转瞬&#xff0c;毕业已近四年&#xff0c;回顾&#xff0c;还在路上。头几年&#xff0c;有着一颗爱玩的心&#xff0c;秉着“人这一辈子不能对不起自己”的谬论&#xff0c;一直随着自己的性子&#xff0c;想做什么就做什么&#xff0c;…

加菲猫语录,只准笑不准学

&#xff0d;今天我要做俯卧撑今天先俯卧&#xff0c;明天再撑。 &#xff0d;&#xff0d;真不愿意起来&#xff0c;尤其我还病了&#xff0c;可我还得带病坚持吃饭。 &#xff0d;&#xff0d;肚子大不可怕&#xff0c;可怕的是肚子里没有好东西。或者说&#xff0c;没有好…

python 什么是原类_Python 什么是元类(metaclasses)?

1.什么是类 在理解元类之前&#xff0c;我们必须先掌握Python中的类(class)。 和大多数语言一样&#xff0c;Python中的类知识用来描述如何“生成一个对象”&#xff1a;但是&#xff0c;在Python中&#xff0c;类不仅能用来描述如何生成一个对象&#xff0c;类本身也是对象。 …

mysql连接指定时区_MySQL创建JDBC连接时区问题

报错内容&#xff1a;ErrorCode0SQLState01S00The server time zone value is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zon…

听说这是和女朋友住一起后的现象之一

1 被人叫醒时的你&#xff01;2 分享一只软糯香甜的香蕉。。3 到底选哪根好呢&#xff1f;4 大叔你的手机壳怎么肥四&#xff1f;&#xff1f;5 听说这是和女朋友住一起后的现象之一6 爱国主义教育培养了一群吃货&#xff01;7 今天做做题吧&#xff01;&#xff08;本视频来源…

PDF 补丁丁 (修改PDF书签;拆分、合并、制作PDF;提取图片) 0.3.0.8 正式版

PDF 补丁丁 0.3.0.8 正式版 新版本已经发布&#xff0c;请到博客首页下载。 软件简介 PDF补丁丁是一个用于修改PDF文件信息的工具。它具有以下功能&#xff1a;■ 修改文档&#xff08;带“*”号部分功能需通过高级补丁修改功能实现&#xff09;&#xff1a; ● 修改文档属性…

Dapr + .NET 实战(八)服务监测

服务监测分布式服务性能指标&#xff0c;链路追踪&#xff0c;运行状况&#xff0c;日志记录都很重要&#xff0c;我们日常开发中为了实现这些功能需要集成很多功能&#xff0c;替换监控组件时成本也很高。Dapr 可观测性模块将服务监测与应用程序分离。它自动捕获由 Dapr sidec…

世界上第一位程序员是位美女——AdaLovelace【有图为证】

AdaLovelace画像 仙女一般吧....简介&#xff1a; 阿达奥古斯塔&#xff0c;19世纪诗人拜伦的女儿&#xff0c;数学家。穿孔机程序创始人&#xff0c;建立了循环和子程序概念。为计算程序拟定“算法”&#xff0c;写作的第一份“程序设计流程图”&#xff0c;被珍视为“第一个…

php mysql管理_MySQL 连接与管理

让 PHP 支持 MySQLPHP 有专有的 MySQL 函数库以使用操作 MYSQL 数据库。在 PHP 5 及以后版本中不再默认支持 MySQL &#xff0c;所以在运行这些库之前&#xff0c;请确定 php.ini 加载了 MySQL 数据库支持&#xff1a;extension mysql.dllMySQL 连接mysql_connect() 函数用于开…

python新手入门总结_初学python的操作难点总结(新手必看篇)

如下所示&#xff1a;1 在cmd下 盘与盘之间的切换 直接 D或d: 就好2 查找当前盘或者文件下面的目录 直接 dir3 想在一个盘下进去一个文件夹&#xff0c;用cd空格目标文件 cd p4 写文件的第一个字母后 按tab键自动补全 如果有多个p开头的则在按tab 会在所有之间切换5 d:切盘 dir…

android开发我的新浪微博客户端-用户授权页面UI篇(3.1)

上一篇讲了讲OAuth授权认证的事情,大概的介绍了OAuth的原理&#xff0c;并且完成了一个OAuth.java的类库&#xff0c;提供了几个OAuth认证必要的方法&#xff0c;本篇开始具体讲本项目的用户授权功能&#xff0c;用户授权页面是当用户第一次使用本软件的时候自动从载入页面跳转…

基于SharePoint革命性的大型企业协同门户产品

OpenShare——基于SharePoint革命性的大型企业协同门户产品&#xff0c;由光合信息技术&#xff08;上海&#xff09;有限公司研发&#xff0c;针对企业用户&#xff0c;目前可以通过其官网下载使用。OpenShare&#xff1a;打开SharePoint的全部潜能SharePoint是个非凡的产品&a…

SharePoint Foundation和SharePoint Server的区别

SharePoint Server 2010用来取代MOSS 2007&#xff0c;它有标准版和企业版两个版本&#xff0c;使用SQL Server数据库&#xff1b; 早期版本中的STS或WSS在2010中更名为SharePoint Foundation&#xff1b; 而SPS 2010包含了SharePoint Foundation和SharePoint Server。 SharePo…

还缺30万人!程序员2020年要过好日子了……

全世界只有3.14 % 的人关注了爆炸吧知识最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经…

iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统

目 录1. 概述... 32. 创建虚拟机&安装华为欧拉&#xff08;openEuler&#xff09;系统... 42.1 创建新的虚拟机... 42.2 默认选择Wowrkstation 16.x. 52.3 选择稍后安装操作系统... 62.4 选择其他Liunx 4.x 64位.…

datatables 一列显示两个字段的数据_【tableau入门教程16】计算字段

有时数据表中的原始维度和度量并不满足我们的需求&#xff0c;因此可通过计算字段功能&#xff0c;利用各种函数新建字段。创建字段步骤1、在侧栏 创建计算字段2、拖曳字段到输入框或是输入部分字段名称选择字段&#xff0c;当输入框下面显示“计算有效”时可点击 确定 完成计算…

gcc 安装包_LNMP安装的前期准备(LNMP一键安装包下载)

如果我们手工安装 LNMP 环境&#xff0c;那么同样需要安装大概 14 个源码包(根据版本和功能不同而不同)。不过&#xff0c;现在网上非常流行的 LNMP 环境的搭建过程是采用 LNMP 一键安装包直接安装。这个一键安装包实际上就是一个事先写好的安装脚本&#xff0c;按照这个安装脚…

Dapr + .NET 实战(七)Secrets

什么是Secrets应用程序通常会通过使用专用的存储来存储敏感信息&#xff0c;如连接字符串、密钥等。通常这需要建立一个密钥存储&#xff0c;如Azure Key Vault、Hashicorp等&#xff0c;并在那里存储应用程序级别的密钥。要访问这些密钥存储&#xff0c;应用程序需要导入密钥存…

loadrunner 参数化数据更新方式

数据分配方式&#xff1a; Select next row【选择下一行】: 顺序&#xff08;Sequential&#xff09;&#xff1a;按照参数化的数据顺序&#xff0c;一个一个的来取。 随机&#xff08;Random&#xff09;&#xff1a;参数化中的数据&#xff0c;每次随机的从中抽取数据。 唯一…

安全也要“易”,谈NAC的硬件化

说到NAC网络访问控制&#xff0c;浮现在我们脑海中的应该就是软件硬件的构成方式&#xff0c;即用软件作为核心的策略决策点&#xff0c;硬件作为策略执行点&#xff0c;这也是标准的NAC构成方式&#xff0c;纵观业界的主流产品&#xff0c;无论Cisco的C-NAC、Juniper的UAC&…