Linq映射EntityDb到Dto很慢,一条记录

Linq mapping EntityDb to Dto is very slow, one record

Linq 将 EntityDb 映射到 Dto 非常慢。

我从 table 获得唯一一条记录,并通过 Id 加入其他 tables。

示例:

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) 我从 SQL Server Profiler 中获得原始 sql-query。

2) 创建纯 DTO class(超过 200 个字段)以供 context.ExecuteStoreQuery.

执行查询

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

结论是:

执行 linq 语句并映射到具有大约 200 个字段的大结构 DTO 大约需要 3 秒。

新解决方案仅需 500-600 毫秒,如上所述!!!

提升了5-6倍!!!

当我们想通过 Id 获取大型记录数据(有很多表)时,对于大型 DTO 结构,linq 语句很糟糕。

P.S。 结构 DTO 模型是 class 和 sub-classes,示例:

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

             and etc...
             over 50 fields
          };