优化LINQ查询 - 如何改善执行时间?

时间:2013-10-18 11:00:08

标签: c# sql linq entity-framework

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

2 个答案:

答案 0 :(得分:4)

如果您更改为加入,事情应该会顺利进行。

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

Linq2Sql不支持将实体加入POCO列表,但只是使用EF测试,一切都很好。

使用Linq2Sql,你会遇到Contains,在这种情况下,我可能只是选择带有表值参数的存储过程。

答案 1 :(得分:0)

EF 4应该支持IN查询翻译。我从来没有遇到EF中的Contains问题,但似乎早期版本没有正确支持它。

You can find more details and a possible solution here