如何在实体框架和 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 获取每个组的最新记录,包括相关实体