ef查询mysql数据库数据支持DbFunctions函数
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函数的更多相关文章
- EF 连接MySQL 数据库 保存中文数据后乱码问题
EF 连接MySQL 数据库 保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...
- 第二百七十七节,MySQL数据库-数据表、以及列的增删改查
MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...
- MySQL数据库数据存放位置修改
MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...
- EF初始化mysql数据库codefirst
EF使用Code First修改生成数据库表名的方法 1. 重写OnModelCreating,去掉表名复数 System.Data.Entity.ModelConfiguration.Convent ...
- MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段
--查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...
- MySql数据库中的datediff函数
MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数 一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果:
- 在Linux环境下,将Solr部署到tomcat7中,导入Mysql数据库数据, 定时更新索引
什么是solr solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化. 准备工作 首先,去下载以下软件包: JDK8:jdk-8u60-linux-x64.tar.gz TOMCA ...
- Ubuntu上更改MySQL数据库数据存储目录
之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...
- mysql数据库数据(字段数过大)太多导入不了的解决方法
mysql数据库数据(字段数过大)太多导入不了的决方法: 1.打开navicat 工具 2.在数据库上右键,执行右键菜单命令“命令列界面” 3.在打开的窗口中,运行set global max_all ...
随机推荐
- C++统一初始化
.C++中指定初始化值的方式有4种方式: ()小括号 ); ()等号 ; ()大括号 }; ()等号和大括号 }; .C++11统一初始化, 即使用大括号初始化方式, 其使用场景主要有以下3种: () ...
- LINUX的文件按时间排序
转载 2014年12月29日 00:49:23 20298 > ls -alt # 按修改时间排序 > ls --sort=time -la # 等价于> ls -alt > ...
- 微信授权,openid 分享
https://packagist.org/packages/fcode/wxshare
- java基础-BigInteger类常用方法介绍
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
- new FileInputStream(file)中file不能为文件夹
今天闲来无事,写了如下程序: package com.xhj.test; import java.io.File; import java.io.FileFilter; import java.io. ...
- httpclient4.5 连接池的封装
随着微服务的流行,服务之间的http调用越来越多,遇到的问题也比较多,写这边文章的目的也是将自己遇到的坑和解决方案跟大家分享 一.为什么要用Http连接池 1.降低延迟:如果不采用连接池,每次连接发起 ...
- 权限 mock location
1.集成环信的时候,该权限报错: mock location权限是是“允许程序创建模拟位置”,主要是提供用于测试.打包的时候并不需要,所以解决办法分两步: 1.声明tools 2.添加忽略:
- Java并发编程原理与实战三十一:Future&FutureTask 浅析
一.Futrue模式有什么用?------>正所谓技术来源与生活,这里举个栗子.在家里,我们都有煮菜的经验.(如果没有的话,你们还怎样来泡女朋友呢?你懂得).现在女票要你煮四菜一汤,这汤是鸡汤, ...
- Javascript实现返回上一页面并刷新
今天写了一个小小的提示成功的页面,同时要求返回上一页面,并实现对上一页面的操作进行刷新(例如删除的,添加的),在网上搜寻了一遍,基本上90%的都是说的是用window.history.go(-1), ...
- 浅谈iOS与社交化网络
CHENYILONG Blog 社交化网络 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong ...