zoukankan      html  css  js  c++  java
  • 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

     1 DELIMITER $$
     2 
     3 USE `dev`$$
     4 
     5 DROP FUNCTION IF EXISTS `AddDays`$$
     6 
     7 CREATE DEFINER=`dev_user`@`%` FUNCTION `AddDays`(a DATETIME,b INT) RETURNS DATETIME
     8 BEGIN
     9     RETURN DATE_ADD(a, INTERVAL b DAY);
    10 END$$
    11 
    12 DELIMITER ;

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

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

       b、修改代码

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

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

    1 SELECT
    2 `Extent1`.`Id`, 
    3 `Extent1`.`Name`, 
    4 `Extent1`.`Time1`, 
    5 `Extent1`.`Time2`
    6 FROM `timetest` AS `Extent1`
    7 WHERE (`Extent1`.`Time2`) > (AddDays(`Extent1`.`Time1`, 2))

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

  • 相关阅读:
    自动化系列-pyppeteer安装
    用python做一个可视化生成二维码的工具
    Python第三方包之DingDingBot
    封装属于自己的Python包
    sqlldr使用
    MS MQ 消息队列
    PDF打印
    oracle 存储过程编辑 卡死
    winrar 压缩文件方法
    数值 转换 成 带千位符的数值,且转成大写
  • 原文地址:https://www.cnblogs.com/wucj/p/10580330.html
Copyright © 2011-2022 走看看