因爲我在看書C# 6.0 in a Nutshell
。下面是書中的一個例子AsEnumerable
。
目的是鑄造一個IQueryable<T>
序列IEnumerable<T>
,迫使隨後的查詢運算符來結合可枚舉運營商,而不是可查詢運算符。這會導致查詢的其餘部分在本地執行。
爲了說明這一點,假設我們在SQL Server中有一個MedicalArticles
表,並且希望使用LINQ to SQL或EF來檢索所有關於流行病的摘要包含少於100個單詞的文章。對於後者斷言,我們需要一個正則表達式:
Regex wordCounter = new Regex (@"\b(\w|[-'])+\b");
var query = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza" &&
wordCounter.Matches (article.Abstract).Count < 100);
的問題是,SQL Server不支持正則表達式,所以LINQ到DB提供程序會拋出異常,抱怨查詢不能轉換爲SQL。首先通過LINQ檢索流感的所有文章,SQL查詢,然後不到100個字的摘要本地過濾:我們可以通過查詢分兩步解決這個
Regex wordCounter = new Regex (@"\b(\w|[-'])+\b");
IEnumerable<MedicalArticle> sqlQuery = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza");
IEnumerable<MedicalArticle> localQuery = sqlQuery
.Where (article => wordCounter.Matches (article.Abstract).Count < 100);
隨着AsEnumerable,我們可以這樣做在單個查詢中:
var query = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza")
.AsEnumerable()
.Where (article => wordCounter.Matches (article.Abstract).Count < 100);
調用AsEnumerable的另一種方法是調用ToArray或ToList。 AsEnumerable的優點是它不會強制立即執行查詢,也不會創建任何存儲結構。
這是真的 - 但不會投射到'IEnumerable'提供相同的結果嗎? –
2010-01-06 15:18:01
我發現'Table.AsEnumerable()。where(somePredicate)'比'((IEnumerable)Table).Where(somePredicate)'更具可讀性''。 –
jason
2010-01-06 15:25:17
我們知道它更具可讀性,但它們是否相等? – 2010-01-06 15:29:56