2013-10-31 56 views
3

我試圖運行此查詢:規範功能「EntityFunctions.TruncateTime」不存在MYSQL

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數據庫第一個
  • NetFramework 4
  • MySQL服務器5.6

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

TruncateTime is supported by MySQL.

Same thing happened to this person.

回答

5

我做不到解決它,所以我剛剛在數據庫中創建了一個名爲「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); 

就是這樣。

1

A Torres' response作品的做法,但對我來說感覺有點哈克,所以我發現另一種方法(這適用於EF6,對EF5了類似的方法存在,但我不能測試):

  1. 創建類DatabaseFunctions和下面的代碼添加到它:

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

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

+0

這應該是答案。查詢優化器將無法使用自定義函數優化任何查詢,因此應使用函數內置的函數 – drake7707

+0

我處於託雷斯的答案在我的情況下不起作用的情況。這個答案看起來非常有希望,但似乎不完整或不正確。例如,我的EDI不瞭解FunctionConvention。你能更完整地解釋你的代碼嗎? – Goose

+0

@ Goose - 我不確定EDI是什麼意思,但如果它不瞭解FunctionConvention,它看起來像你使用的是一個非常舊的版本的實體框架。你知道你使用的是哪個版本嗎? – Svarog