Performance Linq将EntityDb映射到Dto非常慢,一条记录
Linq将EntityDb映射到Dto的速度非常慢 我从表中获取唯一一条记录,并通过Id连接其他表 例如: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 ==
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秒。