2012-09-18 72 views
7

我知道更改查詢的形狀會導致實體框架忽略包含調用,但有沒有一種方法,我可以讓它加載子屬性時,我做了一個選擇許多和一羣通過。在下面的例子中,我想通知所有在特定時間段內有工作的員工。調用.ToArray()之後只能訪問數據庫一次,但我在內存中執行SelectMany和GroupBy。有沒有一種方法可以讓SelectMany和GroupBy在SQL服務器上發生,並且仍然包含ServiceType和Ship以及Employee細節?獲取實體框架,以迫切加載組通過

我正在尋找一種方法對數據庫進行一次SQL調用,並最終得到一份在該時間段內有工作並分配給他們的工作的員工列表。

var employeeJobs = DataContext.Jobs. 
    Include("ServiceType"). 
    Include("Ship"). 
    Include("JobEmployees.Employee"). 
    Where(j => j.Start >= now && j.Start <= finish). 
    OrderBy(j => j.Start). 
    ToArray(). 
    SelectMany(j => j.JobEmployees, (j, je) => new { 
     Job = j, 
     Employee = je.Employee 
    }).GroupBy(j => j.Employee); 
+0

_I我在做memory_中和的SelectMany的GroupBy。你怎麼知道的? EF中查詢的形狀可能難以捉摸。 –

+0

如果你想結束員工和他們的工作列表,我建議以相反的方式進行查詢:employeeJobs =從DataContext.Employees e其中e.Any(...有工作標準...)選擇e。如果沒有任何智能幫助,我無法爲您編寫LINQ查詢,但您明白了嗎? – GTG

+1

@GertArnold對'ToArray'的調用使結果具體化,'SelectMany'和'GroupBy'在* ToArray調用之後*。 – casperOne

回答

0

你爲什麼不創建一個視圖,然後從EF中引用它? ,這還具有數據庫服務器執行工作的額外好處,而不是應用程序服務器。

+0

EF整點是,工作**正在**正在數據庫服務器上完成。因此你的回答沒有意義。 –

-1

嘗試將Include()移動到groupby後面的最後。

+0

Include是在ObjectQuery上定義的,而不是IQueryable,它是GroupBy的返回類型。不要認爲這個工作:( –

1

下面應該工作:

var q = from e in DataContext.Employees 
    where e.Job.Start > .... 
    order by e.Job.Start 
    select new {Employee = e, Job = e.Job, Ship = e.Job.Ship, ServiceType = e.Job.ServiceType}; // No db hit yet. 

var l = q.GroupBy(item=>item.Employee) // no db hit yet. 
    .ToList(); // This one causes a db hit.