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

时间:2018-03-31 15:39:33

标签: 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 == 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 个答案:

答案 0 :(得分:0)

解决方案是:

1)我从SQL Server Profiler获得了原始的sql-query。

2)通过context.ExecuteStoreQuery创建普通DTO类(超过200个字段)进行执行查询。

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

结论是:

执行linq语句大约3秒钟,映射到大型结构DTO,大约200个字段。

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

提高5-6倍!!!

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

P.S。 结构DTO模型是具有子类的类,例如:

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

             and etc...
             over 50 fields
          };