2011-05-23 20 views
4

的方法時,如果你有一個返回值IEnumerable的方法,但內返回IQueryable會返回一個IEnumerable力,即使IQueryable推遲了執行的執行返回一個IEnumerable?查詢使用IQueryable的

public IEnumerable<Customer> Customers() 
{ 
    IEnumerable<Customer> customers = null; 

try 
{ 
    customers = from c in GetCustomers // IQueryable 
      where c.Name=="JO" 
      select c; 
    } 
    catch (SqlException ex) 
    { 
    } 
    return customers; 
} 

回答

3

您返回的結果將是一個枚舉,並將推遲執行,直到您開始枚舉它。但是,與IQueryable不同的是,它不會被任何進一步的操作改變。例如,如果之後您做了類似.Sum()的操作,它將在本地機器上執行,而IQueryable可能會將Sum()發送到遠程數據庫或Web服務。

1

由於IQueryable工具IEnumerable,返回你的對象時,你將不會被強迫任何東西。

+0

http://msdn.microsoft.com/en-us/library/bb351562.aspx'公共接口IQueryable的:IEnumerable的, \t IQueryable的,IEnumerable' – hunter 2011-05-23 17:11:25

1

首先,IQueryable<T>執行IEnumerable<T>,所以你不是真的在這裏「強迫」任何東西,因爲IQueryable<T>將被返回,不需要評估。

其次,IEnumerable<T>通常是懶洋洋地評估以及(通過.ToArray().ToList()foreach()等)

0

你不會強制執行,直到您執行以下(但不限於)之一:

  • ToList()
  • FirstOrDefault()

代碼在物理上需要收集之前不會執行;例如作爲一個數據源。

0

您不會強制執行,因爲IQueryableIEnumerable都是懶惰評估的,IQueryable實現IEnumerable,所以不需要任何轉換。

如果您的架構在這種情況下調整不當,返回的IQueryable只會在計算結果(即迭代結果)時才執行查詢。如果數據庫連接在此時已關閉,您將收到異常。

相關問題