2012-04-25 40 views
1

我想这个查询LINQ VS SQL - 带回太多行

select top(10) * 
from SOMETABLE 
where Name = 'test' 

转换成LINQ,所以我想应该是这样的

var c = 
    (from l 
    in db.SOMETABLE 
    where l.Name= 'test' 
    select l).take(10); 

但是,当我看着服务器profiler我可以看到linq从表中获取所有数据,并可能应用WHERE并从数据库中获取数据。

问题是SOMETABLE有大约10 000 000条记录,并且速度不快。

我做错了吗?

+2

'l.Name ='test''和'.take'立即以3种不同的方式告诉我,这不是您的实际代码。你在做什么*会*工作得很好(查询组合的设计是为了做你想做的),所以你的**实际**代码有问题。因此请**显示**您的*实际*代码。 – 2012-04-25 08:51:17

回答

7

您发布的代码至少有3个错误,所以我认为这不是您的实际代码。为了得到你描述的症状,最可能的原因是你在某处使用了IEnumerable<T>,并且从组成。要获得端到端的查询组合(即在数据库上执行TOP),您需要使用IQueryable<T>。例如,以下是碎:

IEnumerable<SomeType> data = db.SomeTable; 

var c = (from l in data 
     where l.Name == "test" 
     select l).Take(10); 

但以下是绝对细,并指出,仅第一行已经改变:

IQueryable<SomeType> data = db.SomeTable; 

var c = (from l in data 
     where l.Name == "test" 
     select l).Take(10); 

指出的是,这也是相同的:

IQueryable<SomeType> data = db.SomeTable; 

var c = data.Where(l => l.Name == "test").Take(10); 

所以:确保你没有过早强迫它到IEnumerable<T>(或类似的列表)。

作为一个最后的笔记,IIRC实体框架需要一个排序,如果你正在应用跳过/取(错误,如果你不这样做) - 这进一步支持我的猜测,你已经下降到IEnumerable<T>太早,但:不如果您需要指定order by,也会感到惊讶。

+0

我的表是IEnumerable。谢谢! – spdro 2012-04-25 09:17:24