在DateTime比较期间,如何强制Entity Framework使用datetime而不是datetime2?

时间:2017-07-18 21:05:09

标签: c# sql-server entity-framework datetime

我正在使用Entity Framework检索记录,其中一个过滤器是 AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); alertDialog.setTitle("Alert"); alertDialog.setMessage("Alert message to be shown"); alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.show();

它会生成如下查询:

datetime

我有可能将EF转换为([Extent1].[TxnDateTime] >= convert(datetime2, '2015-02-21 00:00:00.0000000', 121)) AND ([Extent1].[TxnDateTime] <= convert(datetime2, '2017-02-21 23:59:59.9999999', 121)) 而不是datetime吗?它似乎要快得多。

我希望EF能够生成这个:

datetime2

使用[Extent1].[TxnDateTime] >= convert(datetime, '21/02/2015') AND [Extent1].[TxnDateTime] <= convert(datetime, '21/02/2017')

  

CPU时间= 1234毫秒,已用时间= 1250毫秒。

使用datetime

  

CPU时间= 1625 ms,经过时间= 1645 ms。

我了解.NET datetime2类型映射到SQL Server DateTime。我有什么选择?

该列可以为datetime2,我将其与datetime

进行比较

1 个答案:

答案 0 :(得分:2)

嗯,有意思!当我使用带有DateTime列的表创建简单数据库模型时,Entity Framework默认情况下会创建一个具有SQL DateTime类型的列,而不是DateTime2。我使用了EntityFramework版本6.1.3

class Blog
{
     public int Id {get; set;}
     public DateTime IntroductionDate {get; set;}
}

Sql Server Management Studio报告列IntrdductionDate具有属性(datetime, not null)

无论如何,前一段时间我遇到的问题是我希望每个DateTime都被建模为dateTime2而不是datetime。我猜您可以使用类似的方法强制列使用datetime

class MyDbContext : DbContext
{
    DbSet<...> ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         // Configure that all used DateTime should be modeled datetime2:
         const string standardDateTimeType = "datetime2";
         modelBuilder.Properties<DateTime>()
             .Configure(p => p.HasColumnType(standardDateTimeType);
         ...
    }

您可以将此功能用于您要建模的所有类型。例如,如果要模拟所有小数都具有相同的精度和比例:

byte standardDecimalPrecision = 19;
byte standardDecimalScale = 8;
modelBuilder.Properties<decimal>()
    .Configure(p => p.HasPrecision(standardDecimalPrecision, standardDecimalScale));

当然,您可以使用ColumnAttribute数据注释设置列的类型,但这会强制您为每个DateTime执行此操作,并且可能会出现以后类会忘记此错误的错误。