2016-03-04 126 views
1

我有一個方法給了我一個對象列表例如使用語句的範圍

public IEnumerable<Person> GetPerson() 
{ 
    using (myEntities ctx = new myEntities()) 
    { 
     return ctx.Person.Where(x => x.Age < 50); 
    } 
} 

別的地方當我打電話FirstOrDefault()選擇被genereated和數據從數據庫中檢索我用這個方法

public void Main() 
{ 
    var pList = GetPerson(); 
    pList = pList.Where(x => x.Age < 40); 

    Person Item = pList.FirstOrDefault(); //materialization here 
} 

問題:using (myEntities ctx = new myEntities())的範圍是否達到物化?

一方面,它的理由是因爲它管理數據庫的選擇/連接,並且在實現中生成 - 另一方面,它在方法外調用,可能在代碼中的任何地方 - 在使用之外指令

+4

我已經編輯你的問題的標題,因爲這是一個使用*語句*,而不是使用*指令*。 –

+0

您是否嘗試執行該代碼,它工作? –

回答

7

不,using聲明並不能完全實現查詢的實現。

除非調用Person已經返回完全物化集合,這是不太可能的,也不是典型的。

會發生什麼情況如下:

  1. 您構建上下文
  2. 你叫上下文的Person屬性,掖在LINQ查詢

    可能的,這將返回延期查詢,尚未執行

  3. 您處理的上下文
  4. 您返回LINQ查詢您構建
  5. 您在查詢調用FirstOrDefault,試圖執行它

在這一點上可能的結果是,該代碼崩潰,因爲你想使用它一直是上下文中執行查詢處置。

+0

好的謝謝你的詳細解釋 – Byyo

1

下面是如何使用工作:

void Main() 
{ 
    Person Item = UsingPerson(ps => ps.Where(x => x.Age < 40).Take(1)).FirstOrDefault(); 
} 


public T[] UsingPerson<T>(Func<IQueryable<Person>, IQueryable<T>> project) 
{ 
    using (myEntities ctx = new myEntities()) 
    { 
     return project(ctx.Person.Where(x => x.Age < 50)).ToArray(); 
    } 
}