实体框架 - 相关实体性能

Posted

技术标签:

【中文标题】实体框架 - 相关实体性能【英文标题】:Entity Framework - Related Entity Perfomance 【发布时间】:2014-02-17 14:05:27 【问题描述】:

我有一个查询要加载特定实体的相关实体,但加载数据需要 5 秒,发生了什么?

var rows = clientes.Select(c => new
        
            c.Id,
            c.Nome,
            Telefone = String.Format("(00) 1", c.DDD, c.Telefone),
            c.Email,
            Veiculo = (from v in c.Veiculos select new  v.Id, v.Modelo, v.Chassi ),
        )
    .Skip(pageNumber > 1 ? qtdRows * (pageNumber - 1) : 0)
    .Take(qtdRows)
    .ToArray();

【问题讨论】:

你能把EF发送到服务器的SQL贴出来吗? 顺便说一句,我认为您需要一个 OrderBy 子句才能让 Skip 可靠地返回预期的实体子集。 那么您的Veiculo 选择正在下拉每个 记录的整个 表,我猜这就是问题所在。 是运行时第一次查询数据库吗?如果是这样,您应该注意实体框架***.com/questions/13250679/…的“热身”问题@ 这可能是因为它是外连接。或者你应该在数据库中添加索引。 【参考方案1】:

您似乎加入了两个实体,但没有使用过滤器来获取当前客户的 Veiculos。

也许你应该使用类似的东西

var rows = clientes.Select(c => new
        
            c.Id,
            c.Nome,
            Telefone = String.Format("(00) 1", c.DDD, c.Telefone),
            c.Email,
            Veiculo = (from v in c.Veiculos *where v.ClientId == c.Id* select new  v.Id, v.Modelo, v.Chassi ),
        )
    .Skip(pageNumber > 1 ? qtdRows * (pageNumber - 1) : 0)
    .Take(qtdRows)
    .ToArray();

但是,更一致的方法是在实体 Client 中添加导航属性 Veiculo,并在 Entity Framework 上放置表格连接。

【讨论】:

停机时间从 5.60 秒到 4.68 秒,在客户端实体中,我有一个导航属性,例如 public virtual IList Veiculos get;放; 我正在使用带有 NInject(DI) 的存储库模式,首先,我正在获取客户端,IList clientes =(来自 c in _clienteRepository.Get(c => c.CodigoDealer = =dealer.Codigo).Include(v => v.Veiculos) select c).Include(b=>b.Beneficios).ToList();,如果删除这一行(从 v in c.Veiculos where v .ClientId == c.Id select new v.Id, v.Modelo, v.Chassi ),速度非常快! 显式的where 在这里没有意义,c.Veiculos 是一个导航属性,因此隐含了where 确切地说,在原始查询中我没有写,但奇怪的是,查询是用 where 子句优化的,所以我不知道为什么使用导航属性查询如此慢。 .. 您能检查一下哪些 sql 请求已发布到 Sql server 并将其发布在您的问题中吗?使用 sql 分析器。

以上是关于实体框架 - 相关实体性能的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 和实体框架性能改进

性能调整实体框架查询

实体框架分离实体和相关实体消失

实体框架的性能问题

要求实体框架在添加新实体之前不要检索相关实体列表

从实体框架中的集合加载相关实体