我知道更改查询的形状会导致实体框架忽略包含调用,但是当我执行select many和group by时,有一种方法可以让它加载子属性。在以下示例中,我想通知在特定时间段内预订了工作的所有员工。在只触及数据库一次的地方之后调用.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 :(得分: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.
答案 1 :(得分:0)
为什么不创建视图然后从EF引用它? ,这也有数据库服务器完成工作的额外好处,而不是应用服务器。
答案 2 :(得分:-1)
尝试将Include()移到groupby之后的最后一步。