我想知道是否有一种优化我的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查询?
如果您更改为联接,那么事情应该进行得更加顺利。
context.table.Join(PKs,t => t.PrimaryKey, pk => pk, (t, pk) => t).AsEnumerable()
Linq2Sql不支持将实体连接到POCO列表,而只是用EF进行了测试,一切都很好。
使用Linq2Sql时,您会陷入困境Contains,在这种情况下,我可能只想使用具有表值参数的存储过程。
Contains