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 个数据库命中。使用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 查询?

4

2 回答 2

4

如果你改为加入,事情应该会顺利得多。

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

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

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

于 2013-10-18T11:09:08.067 回答
0

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

您可以在此处找到更多详细信息和可能的解决方案

于 2013-10-18T11:14:51.030 回答