结合LINQ查询和实体框架c#



我有一个linq查询,它从我的Customer表中选择几个字段。

应用于该方法的是多个滤波器,使用Func<IQueryable<T>, IQueryable<T>>.Invoke

原来的查询实质上是select * from customer

过滤方法本质上是select top 10

输出SQL为select top 10 from (select * from customer)

我的客户表有超过1,000,000行,这导致这个查询在SSMS中执行大约需要7秒。如果我通过在SSMS中运行它将输出SQL更改为select top 10 from (select top 10 * from customer),那么查询是即时的(如您所期望的)。

我想知道是否有人知道什么可能导致LINQ不能以一种很好的方式结合这些,如果有一个最佳实践/解决方案,我可以实现。

我应该注意到,我的实际代码不是select *,而是选择几个字段,但没有什么更复杂的了。

我正在使用SQL Server 2008和MVC 3与实体框架(不确定是什么版本)

编辑:我应该补充,它是可查询的,没有什么是评估,直到结束,结果长时间的执行被限制在单行。

我不知道为什么它没有被优化。

如果过滤器方法真的等同于SELECT TOP 10,那么你应该可以这样做:

return query.Take(10);

将解析为select top 10 * from customer,而不是您最终得到的更复杂的东西。

如果不行的话,我恐怕需要更多的细节。

编辑:澄清一下,如果你在LINQ中这样做:
DataItems.Take(10).Take(10)
你会得到这样的SQL:
SELECT TOP (10) [t1].[col1], [t1].[col2]
FROM (
    SELECT TOP (10) [t0].[col1], [t0].[col2]
    FROM [DataItem] AS [t0]
    ) AS [t1]

所以如果你能用Take(n)的话就没问题了

最新更新