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. 执行composer install 报错的解决办法

    执行composer install后报以下错误: Loading composer repositories with package informationInstalling dependenc ...

  2. 在Ubuntu16.04上安装virtualbox后无法装载vboxdrv模块

    首先按照:http://blog.csdn.net/ipsecvpn/article/details/52175279 这个网址上的教程安装, 安装完成后报错:大体意思就是vboxdrv没有被内核装载 ...

  3. Spring boot学习总结

    引言之前也没有深入学习过spring框架,最近SpringBoot流行起来后想补下这方面的知识,于是照着SpringBoot官网上的英文教程开始helloworld入门,踩到几个小坑,记录下学习流程. ...

  4. Java并发编程原理与实战十六:AQS

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  5. Java并发编程原理与实战十二:深入理解volatile原理与使用

    volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值. synchronized除了线程之间互 ...

  6. MongoDB - MongoDB CRUD Operations, Bulk Write Operations

    Overview MongoDB provides clients the ability to perform write operations in bulk. Bulk write operat ...

  7. 【leetcode 简单】 第六十一题 存在重复元素

    给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [1,2,3,1] 输出: true ...

  8. RGB, YUV及相关标准

    最近在一次排查问题的过程中发现色彩空间及色彩空间转换也有很多技术细节,而理清这些细节能帮助我们更准确的定位视频方面的问题. 1. 色彩空间 色彩空间一词源于英文的“Color Space”,色彩学中, ...

  9. c# 超长字符串截取固定长度后显示...(超长后面显示点点点) 通用方法

    通用方法: 此方法是采用unicode编码方式,一个汉字为2个字节,一个数字or字母是1个字节,此方法传入的第二个长度参数是unicode长度. 所以不用考虑截取的字符串是汉字还是英文字母的问题,参数 ...

  10. MUI上拉加载下拉刷新

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...