2013-10-18 46 views
2

我想知道是否有一种很好的方法来优化我的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个数据库,我从数据库中使用类似于下面的LINQ查询检索数据击中。使用Glimpse检查我看到LINQ查询被翻译成许多独立的SQL调用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

可以使用'context.table.Where(X => x.PrimaryKey == PK [1] || x.PrimaryKey == PK [2])AsEnumerable();' – progpow

+1

它传递数千个对象作为qurery的命令参数是错误的。你应该把它们放在一个单独的表格中,索引列并进行有效的连接。 – AgentFire

+0

PK的内容从哪里来? – spender

回答

3

如果您更改为连接,事情应该顺利得多。

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

LINQ2SQL不支持加盟实体POCO名单,只是与EF测试,一切都很好。

随着Linq2Sql,你坚持Contains,在这种情况下,我可能只是去一个存储过程与表值参数。