此代码中的LINQ出现了一些严重的速度问题(变量名称已更改)
var A = _service.GetA(param1, param2); // Returns Enumerable results
var results = (from b in _B.All() // _B.All() returns IQueryable
join c in _C.All() on b.Id equals c.Id // _C.All() returns IQueryable
join a in A on a.Id equals c.Id
where b.someId == id && a.boolVariable // A bool value
select new
{
...
}).ToList();
即使B和C表中的行数少于100k,该LINQ仍需要花费10秒钟以上的时间来执行。
我仔细研究了一下,通过反复试验,我设法通过将代码更改为LINQ执行时间为200ms:
var A = _service.GetA(param1, param2).Where(a => a.boolVariable); // Returns Enumerable results
var results = (from b in _B.All() // _B.All() returns IQueryable
join c in _C.All() on b.Id equals c.Id // _C.All() returns IQueryable
join a in A on a.Id equals c.Id
where b.someId == id
select new
{
...
}).ToList();
所以我的问题是,为什么这个简单的更改会对LINQ性能产生如此大的影响?唯一的变化是我事先过滤了Enumerable列表,A枚举在过滤之前大约有30个项目,在过滤之后大约有15个项目。
答案 0 :(得分:2)
在您的第一种情况下:首先,它将连接A中的所有记录,这将花费很长时间,然后过滤出a.boolVariable
。
在第二种情况下,在加入之前,A的记录子集较小-当然,这将花费较少的时间来加入。