【发布时间】:2018-11-15 19:37:59
【问题描述】:
我在这段代码中遇到了一些严重的 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 执行时间缩短到 200 毫秒:
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 项。
【问题讨论】:
-
当您对原始代码运行 SQL 跟踪时,提交到数据库的是什么?当您为最终代码运行 SQL 跟踪时,提交到数据库的是什么?
-
我猜
a.boolVariable和b.someId == id的顺序可能会颠倒之类的。 -
请更新您的问题以准确显示在这两种情况下提交到数据库的内容。我认为您忘记编辑您的问题以包含它。
-
请同时向我们展示
GetA的源代码。 -
@Dadoss 如果您不愿意显示源代码,您的问题很可能会被关闭。显示minimal reproducible example 至关重要。许多提出问题的人认为某些事情无关紧要。而且它们通常是不正确的。这是至关重要的。当我们试图帮助你时,你把我们的手绑在背后。错误是几乎可以肯定,因为该方法返回
IEnumerable。
标签: c# .net performance linq