6

我正在尝试运行此查询:

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# 视觉工作室 2010
  • EntityFramework 4 数据库优先
  • 网络框架 4
  • MYSQL 服务器 5.6

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

MySQL 支持 TruncateTime。

同样的事情也发生在这个人身上。

4

2 回答 2

13

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

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

它有效,但我不喜欢它。

这些人做了类似的事情:

MySQL 的 EntityFunctions.AddSeconds 的替代方案

CurrentUtcDateTime 不存在 - 实体框架和 MySql

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

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

就这样。

于 2013-11-01T16:52:57.523 回答
1

A Torres 的响应中的方法有效,但对我来说有点 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。

于 2016-08-22T11:26:58.083 回答