实体框架,性能调整

我有实体“点子”,其中有子实体集“ChildIdeas”。 我需要加载的理念和“ChildIdeas”的计数表(只算!)。 我可以:

预先加载

from i in _dataContext.Ideas.Include("ChildIdeas") ...

优点:由一个请求得到所有必要的数据; 缺点:负荷不必要的数据。 我需要ChildIdeas只计数,不饱满ChildIdeas名单

显式加载

from i in _dataContext.Ideas ... idea.ChildIdeas.Loading()

优点:无; 缺点:许多要求(ideas.count + 1),而不是之一,负载不必要的数据

独立请求

from i in _dataContext.Ideas ... _repository.GetCountChildIdeas(idea.ID);

优点:只加载必要的数据; 缺点:许多要求(ideas.count + 1),而不是一

所有3种类型都有缺点。 也许是存在的任何方式只加载必要的数据? 如果是 - 它是什么,如果没有 - 哪种方式最适合这个案子?

[加]负载测试(1用户)我得到了页面加载(以秒为单位)后:渴望孩子的想法 - 1.31秒显子的想法 - 1.19秒的外部请求 - 1.14秒

所以,对于我来说,渴望的方式是最糟糕的......为什么连明确的方式比较好?

--------------解决方案-------------

您应该使用投影。 Count的孩子的想法是不是持久的一部分Idea实体因此需要创建一个包含所有属性新的非映射类型Idea实体和Count财产。

public class IdeaProjection
{
public int Id { get; set; }
// Other properties
public int Count { get; set; }
}

现在你可以使用简单的投影查询来获取与单个请求一切不加载任何额外的数据:

var query = from x in context.Ideas
where ...
select new IdeaProjection
{
Id = x.Id,
// Mapped other properties
Count = x.ChildIdeas.Count()
};

缺点是IdeaProjection不是实体,如果你想使用它的更新,以及你必须转 ​​变回理念,并告诉EF变化。 从性能角度看,它是最好的,你可以从EF没有得到回复到SQL或存储过程。

分类:实体框架 时间:2015-03-15 人气:0
本文关键词: 性能,实体框架,实体
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.495 (s). 10 q(s)