【问题标题】:Canonical Function "EntityFunctions.TruncateTime" does not exist in MYSQLMYSQL 中不存在规范函数“EntityFunctions.TruncateTime”
【发布时间】:2013-11-11 21:38:40
【问题描述】:

我正在尝试运行此查询:

DateTime DDate=DateTime.Today; //Today's date without Time
var v= db.measurements.Where(m => EntityFunctions.TruncateTime(m.InDate) == DDate);

它只返回这两个日期相等的对象,忽略时间部分。

但我收到:

{"FUNCTION [数据库].TruncateTime 不存在"}

堆栈跟踪:

at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

我正在使用:

  • C# Visual Studio 2010
  • EntityFramework 4 数据库优先
  • 网络框架 4
  • MYSQL 服务器 5.6

MySQL.Data和MySQL.Data.Entity的版本是6.6.5.0

TruncateTime is supported by MySQL.

Same thing happened to this person.

【问题讨论】:

    标签: c# mysql linq entity-framework c#-4.0


    【解决方案1】:

    我无法解决它,所以我只是在数据库中创建了一个名为“TruncateTime”的函数。

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

    它有效,但我不喜欢它。

    这些人做了类似的事情:

    Alternative to EntityFunctions.AddSeconds for MySQL

    CurrentUtcDateTime does not exist - Entity Framework and MySql

    所以现在我认为这可能是不必要的,我可以直接从数据库中调用它并仍然获取实体,如下所示:

    var x = db.ExecuteStoreQuery<Measurement>(@"SELECT field1,field2
    FROM   Measurements
    WHERE  Date(InDate) = {0}", DDate);
    

    仅此而已。

    【讨论】:

    • 我从来没有意识到它不在数据库中。谢谢。
    【解决方案2】:

    A Torres' response 中的方法有效,但对我来说有点 hacky,所以我找到了另一种方法(这适用于 EF6,对于 EF5 存在类似的方法,但我无法测试它):

    1. 创建类 DatabaseFunctions 并在其中添加以下代码:

      [Function(FunctionType.BuiltInFunction, "Date")]
      public static DateTime? Date(DateTime? dateValue) 
          => Function.CallNotSupported<DateTime>();
      
    2. 将以下行添加到 DbContext 中的 OnModelCreating

      protected override void OnModelCreating(DbModelBuilder modelBuilder){
          modelBuilder.Conventions.Add(new FunctionConvention<DatabaseFunctions>())
          // ...
      }
      
    3. 使用 DatabaseFunctions.Date 而不是 EntityFunctions.TruncateTime。

    【讨论】:

    • 这应该是答案。查询优化器将无法使用自定义函数优化任何查询,因此应使用内置函数
    • 我的情况是托雷斯的回答对我来说不起作用。这个答案看起来非常有希望,但似乎不完整或不正确。例如,我的 EDI 不理解 FunctionConvention。你能更完整地解释一下你的代码吗?
    • @Goose - 我不确定 EDI 是什么意思,但如果它不理解 FunctionConvention,看起来您使用的是非常旧版本的实体框架。你知道你用的是哪个版本吗?
    • “集成开发环境”。我有一个全新安装的 Visual Studio 2015,所以我认为它是最近的。
    • 哦,你提到了 IDE。 Visual Studio 版本不一定与您使用的实体框架版本相关联。无论如何,请确保您有对 Entity Framework 6 的引用,并且您在文件顶部添加了“使用 EntityFramework.Functions”(您可能还需要添加对 EntityFramework.Functions 的引用,我不太记得了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2012-09-08
    • 2015-07-25
    • 1970-01-01
    • 2013-08-21
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多