如何在实体框架和 Mysql 中使用规范函数

Posted

技术标签:

【中文标题】如何在实体框架和 Mysql 中使用规范函数【英文标题】:how to use canonical functions in Entity Framework and Mysql 【发布时间】:2015-07-25 22:47:38 【问题描述】:

我想使用 mysql 数据库在 EntityFramework 中将时间跨度添加到 DateTime。

我尝试过使用DbFunctions.AddMinutes(someminutes)EntityFunctions.AddMinutes(someminutes),但是当我执行时我得到了类似的异常

FUNCTION projectName.AddMinutes 不存在

我已经用谷歌搜索但找不到如何执行规范函数。虽然有一个函数列表,但我还是不知道它们属于哪个类 https://msdn.microsoft.com/en-us/library/bb738563.aspx

我正在使用

    MySql.Data.Entities 6.8.3.0 EntityFramework 6.0.0 MySql.Data 6.8.4 MySql.Web 6.8.4 MySql(数据库)5.6.17

我的 Linq 查询如下

IQueryable<OrderViewModel> orders = _dbContext.Orders
                         .OrderByDescending(x => x.ID)
                         .Select(x => new OrderViewModel 
                                         ID = x.ID,
                                          AddedOn = DbFunctions.AddMinutes(x.AddedOn, diffMinutes).Value, 
                                          Customer = (x.IsGuestCheckOut == true ? x.CustomerEmail : x.Customer.FirstName + " " + x.Customer.LastName), 
                                          Phone = x.Phone, 
                                          TotalAmount = x.TotalAmount, 
                                          OrderStatus = x.OrderStatus );

在某些应用条件和分页的地方

【问题讨论】:

你是否在 usings 中添加了 System.Data.Entity 命名空间? @AdilMammadov 是的,它已经在那里了。 【参考方案1】:

其实我误会了它不是的错误

FUNCTION projectName.AddMinutes 不存在

但是

FUNCTION databaseName.AddMinutes 不存在

我不知道问题是什么。我有不兼容的驱动程序/连接器吗,我不知道。

为了解决这个问题,我刚刚创建了名为 AddMinutes 的函数,它在内部调用 DATE_ADD() 函数。函数定义如下

CREATE FUNCTION `AddMinutes`(actualDateTime datetime, minutesToAdd int)
RETURNS datetime
BEGIN
    RETURN DATE_ADD(actualDateTime, INTERVAL minutesToAdd MINUTE);
END

我知道这不是正确的解决方案,而是 HACK

【讨论】:

【参考方案2】:

AddMinutes 方法是 DateTime 类的一部分,因此您可以使用 DateTime 类的实例,即

DateTime dateNow = new DateTime.Now;
dateNow.AddMinutes(someminutes);

DbFunctions.AddMinutes(expression, number) 此函数只能出现在 LINQ to Entities 查询中 (https://msdn.microsoft.com/en-us/library/dn220081(v=vs.113).aspx):

Context.Train.Where(x => EntityFunctions.AddMinutes(x.Start, 10) > DateTime.Now)

【讨论】:

你确定你的mysql驱动支持规范函数吗? 如何检查驱动是否支持规范函数? 昨天我检查了你在 MSSQL 数据库上的 linq 查询,它可以正常工作。今天,我将在我的 Windows 上安装 MySql 数据库并检查你的 linq 查询。我会写你我使用什么样的连接器,条件是它可以工作。 FUNCTION projectName.AddMinutes 不存在 它是 FUNCTION databaseName.AddMinutes 不存在。我做了一个黑客来解决这个问题。我创建了内部调用 DATE_ADD() 的 AddMinutes 函数

以上是关于如何在实体框架和 Mysql 中使用规范函数的主要内容,如果未能解决你的问题,请参考以下文章

具有实体框架并使用 orderby 和 skip/take 的规范模式

如何在实体框架和函数中处理空值

如何使用实体框架和 MySQL 获取每个组的最新记录,包括相关实体

如何在实体框架中映射 CONTAINSTABLE 函数(代码优先)?

如何在实体框架代码优先方法中使用表值函数?

如何在实体框架中使用 unsigned int / long 类型?