【发布时间】:2019-06-15 01:18:19
【问题描述】:
我正在尝试优化我的 EF 查询。我有一个名为 Employee 的实体。每个员工都有一份工具清单。最终,我正在尝试使用未损坏的工具获取员工列表。运行查询时,我可以看到对服务器进行了两次调用:一次用于员工实体,一次用于工具列表。同样,我正在尝试优化查询,因此服务器只被命中一次查询。我该怎么做?
我一直在探索 LINQ 的 join 以及如何创建 LEFT JOIN,但查询仍未优化。
在我的第一个代码块中,结果是我想要的,但是 - 再次 - 服务器有两次命中。
public class Employee
{
public int EmployeeId { get; set; }
public List<Tool> Tools { get; set; } = new List<Tool>();
...
}
public class Tool
{
public int ToolId { get; set; }
public bool IsBroken { get; set; } = false;
public Employee Employee { get; set; }
public int EmployeeId { get; set; }
...
}
var x = (from e in db.Employees.Include(e => e.Tools)
select new Employee()
{
EmployeeId = e.EmployeeId,
Tools = e.Tools.Where(t => !t.IsBroken).ToList()
}).ToList();
第二个代码块模拟了我想要完成的工作。但是,GroupBy(...) 正在客户端计算机上进行本地评估。
(from e in db.Employees
join t in db.Tools.GroupBy(tool => tool.EmployeeId) on e.EmployeeId equals t.Key into empTool
from et in empTool.DefaultIfEmpty()
select new Employee()
{
EmployeeId = e.EmployeeId,
Tools = et != null ? et.Where(t => !t.IsBroken).ToList() : null
}).ToList();
无论如何,我是否可以对服务器进行一次调用,而不是让我的 GroupBy() 在本地进行评估,并让它返回一个员工列表,其中包含未损坏的工具列表的过滤工具列表?谢谢。
【问题讨论】:
-
调用服务器是指查询数据库,对吧?
标签: entity-framework linq entity-framework-core