2012-04-02 100 views
2

我試圖在將查詢應用到IQueryable時獲取項目的計數。IQueryable查詢數據計數

我'試圖做到這一點,如:

this.lblSth.Text = new Repository<Sth>().GetAll().Where(p => p.PersonId == personId).ToList().Count().ToString(); 

我覺得這得到跨越條件的所有數據,並採取了對象,那麼它需要計數;所以我很好奇,舉個例子,我只是把Id列放到列表或其他一些聰明的方式;那算數操作會更快?

Info:GetAll()=>它是一個存儲庫模式方法,它從linqToSql數據實體返回IQueryable對象T.

我接受所有類型的不同想法。由於

+0

這是查詢數據庫嗎?如果是這樣,通過什麼技術? LINQ2SQL? EF? – 2012-04-02 01:20:21

+0

@ChrisShain它包含在LinqToSql – 2012-04-02 01:35:46

回答

1

我認爲對Where和ToList的調用是多餘的。 見下文。

this.lblSth.Text = new Repository<Sth>().GetAll().Count(p => p.PersonId == personId).ToString(); 
+0

對不起,是不是一樣?它是否更具可讀性? – 2012-04-02 01:28:51

+1

@TGH是的,但如果調用只計算lambda做這項工作,爲什麼我想要添加的地方?感覺多餘...少打字至少:) – scartag 2012-04-02 01:30:25

+0

是的我同意我錯過了你的改變計數:-) – TGH 2012-04-02 01:31:05

1

如果你想這樣做更快,只是不叫ToList()

this.lblSth.Text = new Repository<Sth>().GetAll() 
             .Where(p => p.PersonId == personId) 
             .Count() 
             .ToString(); 

這樣,(假設它是一個SQL支持IQueryable<T>),它會執行一個查詢像SELECT COUNT(*) FROM …,不SELECT * FROM …像你的方法。這個查詢應該快得多。

+0

這個問題中,只要拿它的Id或它幾乎一樣更快? – 2012-04-02 01:26:36

+0

這可能取決於你的'IQueryable'提供者和你的數據庫negine,但我懷疑它會有所作爲。 – svick 2012-04-02 01:29:08

+0

好的,非常感謝 – 2012-04-02 01:30:46

0

ToList()將執行查詢並將您的IQUeryable轉換爲IEnumerable。我會在where子句中調用count。這樣計數將成爲結束查詢的一部分

+0

想象這一點的一個好方法是將它連接到db profiler。如果這是SQL Server,你可以SQL Server Profiler – TGH 2012-04-02 01:21:26