EntityFramework 6.1.3和MySQL DbFunctions.TruncateTime不存在?

时间:2015-04-23 21:19:49

标签: c# mysql entity-framework

尝试使用此查询计算今天输入的内容。

var today = DateTime.Today;
var unitsPassedToday = await this.db.Sessions
        .Where(x => DbFunctions.TruncateTime(x.FinishTime) == today)
        .CountAsync();

获得以下例外:

FUNCTION db.TruncateTime does not exist

我发誓之前我曾经使用过这个功能。我没有对System.Data.Entity的任何引用,这是我使用Google搜索找到的唯一解决方案。这是EntityFramework的MySQL实现的某种错误吗?显然我可以编写一个返回此信息的存储过程,但我想知道为什么这不起作用?

MySQL服务器是5.5.23-enterprise。

现在觉得有点愚蠢,看起来这应该是一个简单的问题而且我只是忽略了一些简单的事情......

编辑:

这是SQL实体框架生成的......

SELECT
`GroupBy1`.`A1` AS `C1`
FROM (SELECT
COUNT(1) AS `A1`
FROM `sessions` AS `Extent1`
WHERE (TruncateTime(`Extent1`.`finish_time`)) = @p__linq__0) AS `GroupBy1`

我非常确定TruncateTime不是一个有效的MySQL函数,为什么要调用它?我想我也应该添加使用EDMX图表而不是代码。我已将web.config中的codeConfigurationType添加到目标MySQL,但是......

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

MySql.Data.Entity是版本6.9.6.0

3 个答案:

答案 0 :(得分:0)

解决这个问题的人使用存储过程。

Create FUNCTION TruncateTime(dateValue DateTime) RETURNS date return Date(dateValue);

所以它非常非常混乱。但除了使用存储过程之外,我已经使用了这个变体。

var yesterday = DateTime.Now.AddDays(-1);

var newCustomersCount = _context
  .Customers
  .Where(x => x.RegisterDate > yesterday)
  .ToList()
  .Where(x => x.RegisterDate.Date == DateTime.Now.Date)
  .Count();

我们选择比昨天更新的所有记录。 .ToList()执行一个查询然后我们过滤我们想要的东西。此方法选择最少的必要记录。

答案 1 :(得分:0)

我在codeproject.com上找到了一个解决方案

我测试了解决方案,为我工作!希望它有所帮助

var data1 = context.my_model.Where(x => x.region_name == "Hong Kong" 
                        && x.price_date.Value.Year == dt.Year
                        && x.price_date.Value.Month == dt.Month
                        && x.price_date.Value.Day == dt.Day).ToList();

答案 2 :(得分:0)

如果有人仍然需要... 在Hamad的示例中,他使用可为空的DateTime?因此,它具有“值”属性... 如果您的日期时间不可为空,则可以使用以下示例:

var data1 = context.my_model.Where(x => x.region_name == "Hong Kong" 
                    && x.price_date.Year == dt.Year
                    && x.price_date.Month == dt.Month
                    && x.price_date.Day == dt.Day).ToList();