将IEnumerable与IQueryable结合使用时的LINQ性能问题

时间:2018-11-15 19:37:59

标签: c# .net performance linq

此代码中的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个项目。

1 个答案:

答案 0 :(得分:2)

在您的第一种情况下:首先,它将连接A中的所有记录,这将花费很长时间,然后过滤出a.boolVariable

在第二种情况下,在加入之前,A的记录子集较小-当然,这将花费较少的时间来加入。