我有一个 2 EF 实体定义为:
public class Event
{
public DateTime Created { get; set; }
public string Id { get; set; }
public bool Public { get; set; }
public EventType Type { get; set; }
public virtual ICollection<Note> Notes { get; set; }
}
public class Note
{
public string EventId { get; set; } // Link to parent event
public int Id { get; set; }
public string Text { get; set; }
public virtual Event Event { get; set; }
}
当访问 Event
中的 Notes
集合时,SQL 查询以以下形式构造:
exec sp_executesql N'SELECT
[Extent1].[Id] AS [Id],
[Extent1].[EventId] AS [EventId],
[Extent1].[Text] AS [Text]
FROM [dbo].[Notes] AS [Extent1]
WHERE [Extent1].[EventId] = @EntityKeyValue1',
N'@EntityKeyValue1 nvarchar(128)',
@EntityKeyValue1=N'N5427961'
此查询,给定数据大小和使用的索引需要超过 3000 次读取。鉴于表具有足够的索引,这似乎有点多。查询分析器没有加快查询速度的建议。
然后我发现我是否将 SQL 绑定(bind)中使用的数据类型从 nvarchar(128)
更改为 varchar(33)
,这与 的列类型完全匹配code>EventId
中的 DB 表,查询现在只需要 8 次读取。
这仅仅是我需要使用 DataAnnotations 来告诉 EF 这些字段在 SQL 中的数据类型的情况吗?还是这里发生了其他事情?
最佳答案
我发现最容易达到预期效果的方法是:
modelBuilder.Entity<Event>().Property(x => x.Id).IsUnicode(false).HasMaxLength(33);
另一个建议的使用注释的方法不起作用,导致 nvarchar
仍在使用。
关于c# - Entity Framework 生成的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23933641/