2016-02-10 67 views
0

我开始在Oracle(客户端12.x)中使用EntityFramework 6。 我有DATE列和TIMESTAMP列几个表。EF6 Oracle时间戳和日期

EF6生成的所有查询都将.NET DateTime类型转换为TIMESTAMP。所以查询性能很差。

我试图为DATETIME列添加精度为0,但在生成的查询中没有任何更改。

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

我怎么能在我的代码指定由一个TO_DATE函数,而不是由TO_TIMESTAMP功能到我的where子句翻译?

回答

1

我遇到过与DATE Oracle type和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(); 
} 

所以我可以强制实体框架使用DATE类型的条件:

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

请小心使用大写字母作为函数名称和sch如果使用Oracle,则使用CodeFirstFunctions的ema名称。

如果您需要更多的细节我已经写了一个blog post关于这个与一个示例项目。

+0

您是否试过单独比较实际日期值? var calendar = _repository.Query (c => c.CALNDR_DATE.Year == calendardate.Year && c.CALNDR_DATE.Month == calendardate.Month && c.CALNDR_DATE.Day == calendardate.Day).FirstOrDefault(); – pforsthoff