我想知道是否有一个好的方法来优化我的 LINQ 查询。我正在使用类似于以下内容的 LINQ 查询从数据库检索数据:
// PKs is a list of integers
var import = context.table.Where(x => PKs.Contains(x.PrimaryKey)).AsEnumerable();
我(错误地)假设这会导致如下所示的 SQL 调用:
SELECT * from table where PrimaryKey in (PK[1], PK[2], ...)
即 1 个数据库命中。使用Glimpse http://getglimpse.com/为了检查 SQL 调用,我发现 LINQ 查询被转换为许多单独的 SQL 调用,例如:
SELECT * from table where PrimaryKey=PK[1]
SELECT * from table where PrimaryKey=PK[2]
...
各个查询的执行速度非常快,但由于我的整数列表很大(数千个),开销造成的偏移导致查询需要大约 25 秒才能运行。
我决定通过数据库调用去除耗时的 LINQ 查询,并通过存储过程调用导入数据:
var import = this.p_import(parameter).ToList();
由于只有一次数据库调用,这极大地缩短了响应时间,从大约 25 秒缩短到不到 1 秒。
这解决了我的问题,但我使用 LINQ 的全部原因是为了避免使用存储过程。有没有更好的方法可以优化 LINQ 查询?