admin

优化LINQ查询-如何缩短执行时间?

sql

我想知道是否有一种优化我的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检查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查询?


阅读 166

收藏
2021-06-07

共1个答案

admin

如果您更改为联接,那么事情应该进行得更加顺利。

context.table.Join(PKs,t => t.PrimaryKey, pk => pk, (t, pk) => t).AsEnumerable()

Linq2Sql不支持将实体连接到POCO列表,而只是用EF进行了测试,一切都很好。

使用Linq2Sql时,您会陷入困境Contains,在这种情况下,我可能只想使用具有表值参数的存储过程。

2021-06-07