2013-05-02 56 views
2

我在那裏實現了自己的配置類項目:使用IQueryable和LINQ查詢的好處是什麼?

IconSizesConfigSection: ConfigurationSection 
IconSizesCollection: ConfigurationElementCollection 
IconSize: ConfigurationElement 

Config類存在此屬性:

public IQueryable<IconSize> IconSizes 
    { 
     get 
     { 
      IconSizesConfigSection configInfo = (IconSizesConfigSection)ConfigurationManager.GetSection("iconConfig"); 
      return configInfo.IconSizes.OfType<IconSize>().AsQueryable<IconSize>(); 

     } 
    } 

IconSizes屬性返回IconSizesCollectionConfigurationElementCollection派生。而ConfigurationElementCollection來自ICollectionIEnumerable

在一些其他類我有這樣的代碼:

var previewIconSize = Config.IconSizes.FirstOrDefault(c => c.Name == "AvatarSize"); 

爲什麼在這種情況下使用遞延執行? 爲什麼最初它使用AsQueryable<IconSize>()進行收集,然後使用LINQ和Deffered Execution?

與使用簡單列表相比,有什麼好處嗎?

+0

我的懷疑是作者並沒有真正理解'IQueryable'和'IEnumerable'是什麼。 – AakashM 2013-05-02 14:04:19

回答

1

在這種情況下,沒有實際的好處。使用IQueryable對查詢重寫/翻譯將優化性能的情況有幫助。在提供的示例中,您實際上會導致性能下降。

以有幫助的方式使用IQueryable的一個示例是,在對數據庫或Web服務進行懶惰翻譯和評估查詢時,獲得了顯着的性能提升。這將比抽取大量結果集並在「活動內存」中使用「簡單列表」應用查詢邏輯的方法表現得更好。

你可以告訴你在你的案例中使用IQueryable的方式是有害的,當你開始查詢時,集合已經被加載到內存中。

0

延期執行是很好的,因爲您的用戶可能永遠不會使用結果集,因此沒有任何問題可以查詢數據源。

可能有一些LINQ方法是用戶無法使用的,除非他們將結果轉換爲IQueryable,這意味着您可能會限制它們可以執行的操作,或者強制它們將列表轉換/複製到更有用的列表中。

如果您使用List,那麼您將解決方案硬編碼爲List,您是否關心集合的實現是什麼,您的用戶......可能不會支持必要的接口。

1

IEnumerable和IQueryable都使用延遲執行。區別在於IQueryable用於跨越數據庫查詢,實體框架查詢或OData查詢等邊界。

當IQueryable被迭代時,查詢被轉換爲遠程提供者的習慣用語並在那裏執行。當從遠程提供者接收到響應時,它將被轉換爲本地對象表示。