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
};
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
};