我开始在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子句?
答案 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。