EF6 Oracle TimeStamp&日期

时间:2016-02-10 08:39:29

标签: oracle datetime entity-framework-6

我开始在Oracle(客户端12.x)中使用EntityFramework 6。 我有几个表与DATE列和TIMESTAMP列。

EF6生成的所有查询都将.NET DateTime类型转换为TIMESTAMP。因此查询性能非常差。

我尝试为DATETIME列添加精度为0,但生成的查询没有任何变化。

Property(_ => _.MyDate).HasColumnName("DATE_COLUMN").HasPrecision(0);

如何在我的代码中指定通过TO_DATE函数而不是TO_TIMESTAMP函数来翻译我的where子句?

1 个答案:

答案 0 :(得分:1)

我在DATE Oracle类型和EF6.1上遇到了类似的问题。 我的解决方法是使用CodeFirstFunctions库(仅适用于EF6.1及更高版本)并在Oracle中首先指定转换函数:

create or replace FUNCTION TO_DATE_LOCAL 
(
  DATETIMETOCONVERT IN VARCHAR2 
, CONVERTFORMAT IN VARCHAR2 
) RETURN DATE AS 
BEGIN
  RETURN to_date(DATETIMETOCONVERT, CONVERTFORMAT);
END TO_DATE_LOCAL;

后来在我的DbContext中:

[DbFunction("CodeFirstDatabaseSchema", "TO_DATE_LOCAL")]
public static DateTime ToDateLocal(string dateTimeToConvert, string convertFormat)
{
    // no need to provide an implementation
    throw new NotSupportedException();
}

所以我可以强制Entity Framework在where条件中使用DATE类型:

var measurement = 
  context.Measurements
    .Where(m => m.MeasuredAt == 
          PlantContext.ToDateLocal("2016.01.01 10:00:00", "YYYY.MM.DD Hh24:MI:SS"))
    .FirstOrDefault();

如果使用Oracle,请小心使用大写字母表示函数名称和使用CodeFirstFunctions的模式名称。

如果您需要更多详细信息,我已经通过示例项目撰写了blog post