2011-12-13 62 views
1

我有一个LINQ查询,从我的客户表中选择几个字段。结合LINQ查询与实体框架C#

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

原始查询本质上是select * from customer

过滤方法本质上是select top 10

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

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

我想知道是否有人知道什么可能会导致LINQ不能以很好的方式组合这些东西,以及是否可以实现最佳实践/解决方法。

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

我使用SQL Server 2008和MVC 3与实体框架(不知道是什么版本)

编辑:我要补充,这是IQueryable的一路中,没有评估,直到结束,其结果是长时间的执行仅限于这一行。

+0

你曾经解决过这个问题吗? – 2012-06-21 11:05:59

回答

0

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

如果过滤方法真的是相当于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)你会好起来的。