实体框架 - 相关实体性能
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 IListwhere
在这里没有意义,c.Veiculos
是一个导航属性,因此隐含了where
。
确切地说,在原始查询中我没有写,但奇怪的是,查询是用 where 子句优化的,所以我不知道为什么使用导航属性查询如此慢。 ..
您能检查一下哪些 sql 请求已发布到 Sql server 并将其发布在您的问题中吗?使用 sql 分析器。以上是关于实体框架 - 相关实体性能的主要内容,如果未能解决你的问题,请参考以下文章