我有一个巨大的性能问题,EF将我的数据从数据库中删除。
假设我有一个像这样的类层次结构(想象这些都是EF生成的):
public partial class Container {
public int Id { get; set; }
IEnumerable<Box> Boxes {get;set;}}
public partial class Box {
public int Id { get; set; }
IEnumerable<Part> Parts {get;set;}
// Navigational property
public virtual Container Container { get; set; }
}
public partial class Part{
public int Id { get; set; }
IEnumerable<Attachment> FrontAttachments {get;set;}
IEnumerable<Attachment> BackAttachments {get;set;}}
public partial class Attachment{
public int Id { get; set; }
String Name;}
现在,因为我需要对这些东西进行分类,并且EF不能很好地与WCF或ASP.NET MVC一起使用(因为循环引用/导航属性) - 我创建了一组重复的对象,并调用它们:{ {1}},ContainerDTO
,BoxDTO
,PartDTO
。
为了轻松创建DTO,我为每个实体添加了AttachmentDTO
属性。例如。在容器上它看起来像这样:
DTO
然而,现在当我进行如下查询时:
public partial class Container {
public DTO get{
return new ContainerDTO {
Boxes = this.Boxes.Select(b=>b.DTO); //since Box also has DTO property
}
};
}
这实际上会生成数千个查询(每个容器一个!)。
更糟糕的是,即使我在LINQ中执行完整的查询。 E.g:
var db = context; //get context
var containers = db.Container.ToList().Select(c=>c.DTO);
为了将结果转换为C#等效DTO,它仍然需要很长时间(大约14K箱子超过10秒)。
现在,我很少需要修改数据 - 大部分是读取它。 有没有人有过这种深层嵌套,相互关联的层次结构的经验?面向文档的数据库(例如mongodb)能让我加快速度吗?
欢迎任何提示。
答案 0 :(得分:1)
我会考虑阅读这篇文章的答案:IEnumerable vs List - What to Use? How do they work?。您似乎正在使用ToList()强制实现,其中可以使用IEnumerable延迟它。