1、缘由

快下班的时候,一同事说在写linq查询语句时where条件中写两时间相减大于某具体天数报错;后来仔细一问,经抽象简化,可以总结为下面的公式:

a、当前时间 减去 某表时间字段 大于 某具体天数  ;简化后:常量-变量>常量 ;

b、数据库表某时间字段1 减去 数据库某时间字段2 大于 某具体天数 ;简化后:变量-变量>常量 ;

对于上述情况,linq是完全支持a的。那么对于b,则需要绕个圈子,要么将数据加载到内存,然后在内存中计算;要么通过其他方式,比喻在linq语句中直接调用C#的内置函数,这里我们选择内置函数方式处理。

2、进坑

a、首先想到的是AddDays方法,直接报错“LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression”,很明显说不能识别AddDays方法;

b、然后谷歌搜索,说需要用到DbFunctions的扩展函数 AddDays,然后开干修改代码,竟然又报错“找不到数据库函数AddDays”;懵逼了,继续查资料,然来ef中这个DbFunctions支持sqlserver数据库;到这里就很明显了,需要在mysql数据库中新建函数AddDays;

3、曙光

a、在对应的数据库中新建函数,命名为:AddDays

 DELIMITER $$

 USE `dev`$$

 DROP FUNCTION IF EXISTS `AddDays`$$

 CREATE DEFINER=`dev_user`@`%` FUNCTION `AddDays`(a DATETIME,b INT) RETURNS DATETIME
BEGIN
RETURN DATE_ADD(a, INTERVAL b DAY);
END$$ DELIMITER ;

按照程序里面的逻辑,这里使用了mysql的内置函数DATE_ADD。

小插曲:刚开始新建函数时老是不成功,后来搜索mysql创建函数,才发现,mysql数据的配置里面有是否允许新建函数的开关,如是用脚本打开开关,再执行上面的函数脚本,就ok了。

b、修改代码

 using (var dbContext1 = new MySqlDbContext1("name = MySqlConnectionString_Dev"))
{
var timeQuery = new MySqlDbProvider<TimeTestEntity>(dbContext1).GetQueryable(); var result2 = timeQuery.FirstOrDefault(w => w.Time2 > DbFunctions.AddDays(w.Time1,)); }

c、查看翻译出来的sql语句如下

 SELECT
`Extent1`.`Id`,
`Extent1`.`Name`,
`Extent1`.`Time1`,
`Extent1`.`Time2`
FROM `timetest` AS `Extent1`
WHERE (`Extent1`.`Time2`) > (AddDays(`Extent1`.`Time1`, 2))

4、心情舒畅,又搞定了一个问题。

ef查询mysql数据库数据支持DbFunctions函数的更多相关文章

  1. EF 连接MySQL 数据库  保存中文数据后乱码问题

    EF 连接MySQL 数据库  保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...

  2. 第二百七十七节,MySQL数据库-数据表、以及列的增删改查

    MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...

  3. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

  4. EF初始化mysql数据库codefirst

    EF使用Code First修改生成数据库表名的方法 1. 重写OnModelCreating,去掉表名复数 System.Data.Entity.ModelConfiguration.Convent ...

  5. MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段

    --查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...

  6. MySql数据库中的datediff函数

    MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数   一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果:

  7. 在Linux环境下,将Solr部署到tomcat7中,导入Mysql数据库数据, 定时更新索引

    什么是solr solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化. 准备工作 首先,去下载以下软件包: JDK8:jdk-8u60-linux-x64.tar.gz TOMCA ...

  8. Ubuntu上更改MySQL数据库数据存储目录

    之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...

  9. mysql数据库数据(字段数过大)太多导入不了的解决方法

    mysql数据库数据(字段数过大)太多导入不了的决方法: 1.打开navicat 工具 2.在数据库上右键,执行右键菜单命令“命令列界面” 3.在打开的窗口中,运行set global max_all ...

随机推荐

  1. Java入门:注册模块的实现

    1.主活动图 用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册.具体的活动图如下: 以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实 ...

  2. Docker入门与应用系列(二)镜像管理

    1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

  3. Writing Genres 英文文章文体

    Description 描述文 It is painting a picture in words of a person, place, object, or scene. narration  记 ...

  4. python 异常处理(try...finally...和with...as 方法)

    try...finally... 结构 我们在执行一长串关联命令时,会有一个问题,如果当中一个命令失败了,整个命令串事实上就没有必要执行下去了.在异常发生时,我们也需要执行一些收场工作.比如 clos ...

  5. python中高阶函数与装饰器(2)

    函数返回值为内置函数名: def sum(*args):    def sum_in():        ax = 0        for n in args:            ax = ax ...

  6. Java基础-IO流对象之字节流(Stream)

    Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...

  7. Showbo.js弹窗实现(jquery)

    一.搭建环境 下载showBo.js和showBo.css 下载链接:https://pan.baidu.com/s/1iUUlKXFNXCBEvBnds4ECIA  密码:its4 显示效果图: 二 ...

  8. HTTP协议(3):HTTP1.1与HTTP1.0的区别

    翻了下HTTP1.1的协议标准RFC2616,下面是看到的一些它跟HTTP1.0的差别. 1. Persistent Connection持久连接 在HTTP1.0中,每对Request/Respon ...

  9. Hi35xx 通用GPIO 使用篇(板子3G电源控制脚说明)

    在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK  xxx/osdrv/tools/board_tools/ ...

  10. windows查找端口占用/ 终结端口占用 ------------windows小技巧

    前沿 我是一名小程序员,经常通过一些类似tomcat,jettry 等服务器工具 调试项目.有时候莫名其妙的就会出现 程序关闭不正常的情况!去查端口又死活找不到!最后只能重启电脑 后面,在网上查了一些 ...