我正在使用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
答案 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执行此操作,并且可能会出现以后类会忘记此错误的错误。