c# - Entity Framework 生成的 SQL 查询

标签 c# sql entity-framework

我有一个 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/

相关文章:

entity-framework - 如何将参数传递给DbContext.Database.ExecuteSqlCommand方法?

entity-framework - 对 Entity Framework 的表子集进行逆向工程

c# - 如何保护连接字符串

MySQL(版本 5.5): Why `JOIN` is faster than `IN` clause?

sql - 如何正确创建递归查询?

sql - 选择实时值的时间间隔 - 缺少第一个和最后一个间隔

c# - 错误 : Cannot execute this command because Microsoft. EntityFrameworkCore.Design 未安装

c# - 删除此 'return' 语句或使其成为条件

c# - 你如何在linq中按最大数排序

c# - 如何在代码中设置useUnsafeHeaderParsing