2

今天在使用 LINQ 时,我发现 LINQ to 实体不支持 TakeWhile(),有没有有效的方法来实现这样的功能?我的用例如下 -

我有一个员工实体,我已经按名称对实体进行了排序,现在我想从这个 IQueryable 中获取记录直到时间(EmployeeID = 123)

像这样的东西-

IQueryable<Employee> employees = ObjectContext.Employees
          .OrderBy(a => a.Name)
          .TakeWhile(a => a.EmployeeId != 123)

但是在上面的代码中,Linq to Entities 不支持 TakeWhile,因此它会引发错误。


我正在尝试以下方法,如果有人有更好和有效的方法,请告诉我:

  • 获取前 X 条记录,
  • 检查所需的 EmployeeId 是否是其中的一部分,
    • 如果不是,则获取下一组 X 记录
    • 并将它们与上一组连接起来
    • 并检查 EmployeeID 是否再次成为其中的一部分,
    • 在 X 记录集中找到匹配的 EmployeeId 时中断循环。
4

2 回答 2

0

你不应该排序Name,而应该存储在某个地方Id。可能是,这将有助于:

// eager loading of employees, which name is less or equal, than stored name:
ObjectContext.Employees.Where(a => a.Name.CompareTo(storedName) < 0 || a.Name.CompareTo(storedName) == 0)

// lazy loading the rest of employees:
ObjectContext.Employees.Where(a => a.Name.CompareTo(storedName) > 0)
于 2013-06-17T11:07:42.080 回答
0

SQL中没有TakeWhile()等效项,因此您必须在内存中执行该步骤。您可以强制执行 SQL,方法是IQueryable<>IEnumerable<>添加没有 SQL 等效项的过滤器之前强制执行 SQL。

var employees = ObjectContext.Employees
      .OrderBy(a => a.Name)
      .AsEnumerable()  // filters after this point will be done in memory on each record
      .TakeWhile(a => a.EmployeeId != 123)
于 2013-06-17T12:09:51.233 回答