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。
答案 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
};