我想知道是否有一种优化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查询?
答案 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问题,但似乎早期版本没有正确支持它。