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 配合使用(因为循环引用/导航属性) - 我创建了一组重复的对象,并将它们命名为:ContainerDTO
、、、、。BoxDTO
PartDTO
AttachmentDTO
为了轻松创建 DTO,我DTO
为每个实体添加了一个属性。例如在容器上它看起来像这样:
public partial class Container {
public DTO get{
return new ContainerDTO {
Boxes = this.Boxes.Select(b=>b.DTO); //since Box also has DTO property
}
};
}
但是,现在当我执行如下查询时:
var db = context; //get context
var containers = db.Container.ToList().Select(c=>c.DTO);
这实际上会生成数千个查询(每个容器一个!)。
更糟糕的是,即使我在 LINQ 中进行了完整的查询。例如:
var q = from container in db.Container
select new BoxDTO{
Parts = from part in container.Parts
select new PartDTO
{
...
}
}
仅将结果转换为 C# 等效 DTO 仍然需要很长时间(大约 14K 盒子需要 10 秒以上)。
现在,我很少需要修改数据——主要是阅读它。有没有人经历过如此深度嵌套、相互关联的层次结构?一个面向文档的数据库(例如 mongodb)能让我加快速度吗?
欢迎任何提示。