2012-04-25 43 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