我试图解决这个问题,为什么linq比手动编程快得多。
情景1:
Series = _model.Titles
.Where(t => TempIds.Contains(t.ID))
.ToList()
.Select(t => new BaseSeries(t))
.ToList();
情景2
foreach (var title in _model.Titles)
{
if (TempIds.Contains(title.ID))
{
Series.Add(new BaseSeries(title));
TempIds.Remove(title.ID);
if (TempIds.Count == 0)
break;
}
}
当我计算时,Linq完成查询并在.265s中创建列表
虽然foreach需要2.62s?
Linq也在进行额外的演员表。需要First .ToList()来防止Linq实体错误。这个表挺大的。缓存尚未实现,因此它不是缓存。
Linq如何进行优化,使其完成速度提高10倍?
答案 0 :(得分:9)
_model.Titles.Where(t => TempIds.Contains(t.ID))
此行仅从数据库中提取符合条件的记录。
foreach (var title in _model.Titles)
虽然这会将整个表拉入数据库,并在将记录转换为对象后执行过滤。因此存在差异。
这两者的基础查询可能如下所示:
-- _model.Titles.Where(t => TempIds.Contains(t.ID))
select * from Title where TempIds like '%' + ID + '%'
-- foreach (var title in _model.Titles)
select * from Title