2016-02-10 3 views
0

Я начинаю использовать EntityFramework 6 с Oracle (клиент 12.x). У меня есть таблицы с разделителями с столбцами DATE и столбцами TIMESTAMP.EF6 Oracle TimeStamp & Date

Все запросы, сгенерированные EF6, преобразуют .NET DateTime в TIMESTAMP. Таким образом, производительность запросов очень плохая.

Я попытался добавить точность к 0 для столбцов DATETIME, но ничего не изменится в сгенерированном запросе.

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

Как я могу указать в своем коде, чтобы перевести мое где положение с помощью функции TO_DATE, а не функцией TO_TIMESTAMP?

ответ

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(); 
} 

Я может заставить Entity Framework использовать тип DATE в состоянии, где:

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

Будьте осторожны, чтобы использовать заглавные буквы для имени функции и для СХ ema с помощью CodeFirstFunctions, если вы используете Oracle.

Если вам нужна дополнительная информация, я написал об этом 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

Смежные вопросы