我有一个在Azure上运行的网站,这让我很头疼。我认为在Azure中,select查询是一个昂贵的查询,它来自EF。
查询是针对数据库中的varchar
列的选择,但是从EF中,它将其转换为nvarchar(4000)
,导致查询超时。
下面是我在代码中调用查询的方式:
var myObject = db.MyTable.FirstOrDefault(cm => cm.MyField == entryModel.MyField.Trim());
我已经搜索了许多解释EF如何使用nvarchar
而不是varchar
的资源,因此我尝试将此注释添加到我的模型类中的字段:
[Column(TypeName = "varchar(50)")]
当这不起作用时,我尝试将此添加到OnModelCreating
方法:
modelBuilder.Entity<MyTable>().Property(x => x.MyField).IsUnicode(false);
我也试过强制所有字符串为varchar
:
modelBuilder.Properies<string>().Configure(x => x.HasColumnType("varchar(1000)"));
查询仍然会导致性能问题,根据数据库中的活动监视器,查询仍然显示如下:
(@p__linq__0 nvarchar(4000))SELECT TOP (1)
blah blah fields
FROM [dbo].[MyTable] AS [Extent1]
WHERE ([Extent1].[MyField] = (LTRIM(RTRIM(@p__linq__0)))) OR (([Extent1].[MyField] IS NULL) AND (LTRIM(RTRIM(@p__linq__0)) IS NULL))
你知道是什么原因造成的吗?我现在正准备编写一个存储过程来调用,而不是使用这个EF查询。
编辑感谢@Robert Harvey和@StriplingWarrior的帮助删除内联trim允许EF识别varchar更改,并从实际的SQL调用中删除trim。
var myField = entryModel.MyField.Trim();
var myObject = db.MyTable.FirstOrDefault(cm => cm.MyField == myField);
谢谢!
亚伦
如果使用注释,请考虑分别指定Column和MaxLength。
[Required]
[Column(TypeName = "varchar")]
[MasLength(20)]
string MyString { get; set; }