结合LINQ查询和实体框架c#
本文关键字:框架 实体 LINQ 查询 结合 | 更新日期: 2023-09-27 18:17:38
我有一个linq查询,它从我的Customer表中选择几个字段。
应用于该方法的是多个滤波器,使用Func<IQueryable<T>, IQueryable<T>>
和.Invoke
。
原来的查询实质上是select * from customer
。
过滤方法本质上是select top 10
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)
的话就没问题了