8

我知道更改查询的形状会导致 Entity Framework 忽略包含调用,但是当我执行 select many 和 group by 时,有没有办法让它加载子属性。在下面的示例中,我想通知在特定时间段内预订工作的所有员工。在 where 之后调用 .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);
4

3 回答 3

1

The following should work:

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.
于 2015-02-19T11:44:41.630 回答
0

为什么不创建一个视图,然后从 EF 引用它?,这还有一个额外的好处,那就是数据库服务器完成工作,而不是应用程序服务器。

于 2012-09-19T11:27:19.313 回答
-1

尝试在您的 groupby 之后将 Include() 移动到最后。

于 2014-03-18T21:16:37.487 回答