3

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、、、、。BoxDTOPartDTOAttachmentDTO

为了轻松创建 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)能让我加快速度吗?

欢迎任何提示。

4

1 回答 1

1

我会考虑阅读这篇文章的答案:IEnumerable vs List - What to Use?它们是如何工作的?. 看来您正在强制使用 ToList() 实现,可以使用 IEnumerable 来推迟执行。

于 2013-05-13T19:32:15.217 回答