2

我有一个这样构建的员工列表:

var employees = db.employees.Where(e => e.isActive == true).ToList();

var latestSales = from es in db.employee_sales.Where(x => x.returned == false);

现在我想要的是这样的结果:

int employeeId
List<DateTime> lastSaleDates

所以我尝试了这个,但是查询需要很长时间才能完成:

var result = 
  (from e in employees
   select new EmployeeDetails
   {
      EmployeeId = e.employeeId,
      LastSaleDates = 
           (from lsd in latestSales.Where(x => x.EmployeeId == e.EmployeeId)
                                   .Select(x => x.SaleDate)
            select lsd).ToList()
   };

以上工作,但实际上需要1分钟才能完成。

有什么更有效的方法来做到这一点?

4

3 回答 3

6

您可以使用连接在单个查询中获取所有数据

var result = from e in db.employees.Where(x => x.isActive)
             join es in db.employee_sales.Where(x => x.returned)
                  on e.EmployeeId equals es.EmployeeId into g
             select new {
                  EmployeeId = e.employeeId,
                  LastSaleDates = g.Select(x => x.SaleDate)
             };

不幸的是,您不能将ToList()方法与 Linq to Entities 一起使用。因此,要么手动将匿名对象映射到您的对象,EmployeeDetails要么将LastSalesDates类型更改为IEnumerable<DateTime>.

于 2013-06-12T20:28:32.203 回答
3

你的电话ToList正在把事情拉到记忆中。您应该选择构建 Linq 表达式,而不是将整个查询拉入内存。在您的第二个查询中,您正在为每个员工发出一个新查询,因为您随后在 Linq-to-objects 域中操作(而不是在 EF 中)。尝试删除您对ToList.

您还应该考虑使用外键关联属性来使这个查询更好。关联属性是 EF 中最强大和最有用的部分。在此处阅读有关它们的更多信息。如果你有正确的关联属性,你的查询可以看起来像这样:

var result = from e in employees
      select new EmployeeDetails
    {
        EmployeeId = e.employeeId,
        LastSaleDates = e.AssociatedSales
    }

您也可以考虑改用联接。在此处阅读有关 Linq 的Join方法。

于 2013-06-12T20:28:39.923 回答
1

在您的模型中,员工和 latestSales 之间是否存在关联?您是否检查过 SQL Profiler 或其他分析工具以查看生成的 SQL?确保 ToList() 没有为每个员工发出单独的查询。

如果您可以使用结果结构 as IEnumerable<EmployeeId, IEnumerable<DateTime>>,则可以考虑将其修改为:

var result = (from e in employees
        select new EmployeeDetails
        {
                EmployeeId = e.employeeId,
                LastSaleDates = (from lsd in latestSales
                                 where e.employeeId equals lsd.EmployeeId
                                 select lsd.SaleDate)
        };

我在http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-Database-Performance-hints有一些更一般的建议,以帮助追踪问题。

于 2013-06-12T20:33:51.233 回答