2012-03-07 64 views
0

我是Linq的初學者,我觀察到我的內部連接查詢比例如跨代碼中的表更慢,效率也更低。此外,在ListView中收取的這些數據要輕得多。在Linq上加入表效率

下面是代碼:

public static IEnumerable<Alumno> GetItems() 
{ 
     return (from gal in me.Table<GrupoAlumno>() 
       join alu in me.Table<Alumno>() 
       on gal.IdAlumno equals alu.ID 
       select alu); 
} 

這怎麼可能?

謝謝。

+0

什麼是'me.Table ()'和'me.Table ()'類型?它究竟返回了什麼?你能否告訴我們更快的代碼? – svick 2012-03-07 16:08:13

+0

-1不可理解的問題。我的第一個問題(以下還有更多):你在使用LinqToSql還是LinqToObjects? – 2012-03-07 17:12:55

+0

對不起,我的英語。我不知道兩者的區別。無論如何,這個問題都解決了。謝謝 – daniherculano 2012-03-07 17:26:44

回答

1

我的問題解決了。這是必要的轉換toList(),現在加載到我的ListView的數據工作正常。

public static IEnumerable<Alumno> GetItems() 
{ 

     return (from gal in me.Table<GrupoAlumno>() 
       join alu in me.Table<Alumno>() 
       on gal.IdAlumno equals alu.ID 
       select alu).ToList(); 
} 
0

Linq運營商的工作原理是IEnumerable<T>,所以它現在可以對數據進行排序的假設,也可以利用任何更好的方式來訪問數據,而不僅僅是循環訪問數據。

當數據量增加時,通常可以使用其他構造來編寫效率更高的代碼,這些構造利用底層數據存儲和其他有關數據的已知事實。

如果性能是一個問題(你是否分析了你的代碼來驗證這確實是一個問題?),那麼linq可能不是要走的路。我認爲當性能不如執行時間重要時,linq非常好地表達對數據的搜索和操縱。如果相反,linq可能對你來說太慢了。

1

我不同意現有的接受答案!

Linq並不只是在IEnumerable<T>上運行 - 它也可以在IQueryable<T>上運行,並且當它運行時,Linq語句通常以查詢語言(如SQL)執行。在這種情況下,Linq在性能上非常類似於直接在SQL中操作,但具有編譯時類型檢查和智能感知等其他優點。

我會同意@Anders,無論你什麼時候遇到性能問題,那麼測量發生的事情都是一個很好的第一步 - 但我肯定不同意「linq可能不是要走的路」 - 我會說相反 - 「linq可能是要走的路」,但是請確保你測量並理解正在發生的事情 - 就像使用SQL一樣,linq查詢很容易做你真正沒有想到的事情!

+0

我認爲OP是在問linq-to-objects,所以這就是我的答案。 Linq對某事使用'IQueryable '是另一個關於表演的故事。 – 2012-03-07 21:01:06

+1

瞭解:)我只是有點謹慎,因爲它包含'表'這讓我想到OP必須使用SQLite ......但有些事告訴我我們永遠不會發現真相:) – Stuart 2012-03-08 12:42:28