Performance Linq将EntityDb映射到Dto非常慢,一条记录

Performance Linq将EntityDb映射到Dto非常慢,一条记录,performance,entity-framework,linq,dto,Performance,Entity Framework,Linq,Dto,Linq将EntityDb映射到Dto的速度非常慢 我从表中获取唯一一条记录,并通过Id连接其他表 例如: DataAccess da; var res = from t1 in da.Table1 join t2 in da.Table2 on t1.rf_table2Id equals t2.Table2Id join etc... over 20 joins... where t1.Table1Id ==

Linq将EntityDb映射到Dto的速度非常慢

我从表中获取唯一一条记录,并通过Id连接其他表

例如:

DataAccess da;

var res = from t1 in da.Table1
          join t2 in da.Table2 on t1.rf_table2Id equals t2.Table2Id
          join etc...
          over 20 joins...

          where t1.Table1Id == 20 /*example*/
          select new MyDto
          {
            Id = t1.Table1Id,
            Name = t1.Name,
            Type = new ReferenceDto() 
            {
                Id = t2.Table2Id,
                Name = t2.Name
            },

            and etc...
            over 50 fields
          };
映射中的问题。如果我在没有映射所有字段的情况下获取记录,只有Id,
res.FirstOrDefault()
在100-500毫秒内快速执行

但是,如果我映射所有字段,则执行
res.FirstOrDefault()
需要3秒钟,这太慢了

我的DTO是结构视图

在SQL Server Profiler中,查询运行得非常快

我能做什么


我需要通过Id记录一次性获取更多信息。

解决方案是:

1) 我从SQLServer探查器获取原始sql查询

2) 为按上下文执行查询创建普通DTO类(超过200个字段)。ExecuteStoreQuery

3) 然后,我将结果普通DTO映射到我的结构DTO模型

结论是:

大约3秒钟执行linq语句,并映射到大结构DTO,其中包含大约200个字段

而且只有500-600毫秒的新解决方案,如上所述

提高5-6倍

当我们想要通过Id获取大记录数据(有许多表)时,使用大DTO结构的linq语句是不好的

附言。 结构DTO模型是带有子类的类,例如:

 select new MyDto
          {
             Id = t1.Table1Id,
             Name = t1.Name,
             Type = new ReferenceDto() 
             {
                Id = t2.Table2Id,
                Name = t2.Name
             },

             and etc...
             over 50 fields
          };

唯一的身份,你这是什么意思?我很确定这是一个EF忽略大部分,甚至全部连接的查询。查看为这两个查询生成的SQL。另外,“超过20人加入”也意味着麻烦。这可能意味着EF必须进行大量后处理,才能从来自数据库的平面结果集创建对象图。我按Id获取记录。在SQL Server Profiler中,我获取SQL查询,它运行得很快,它按Id返回一条记录,其中包含20个表中的所有数据(相互连接)。我不笨。请显示500毫秒后返回的LINQ查询。映射不可能为500毫秒查询添加2.5秒。