从linq语句中调用函数

时间:2011-03-03 14:16:35

标签: c# linq linq-to-entities

只是想知道这是否是最有效的方法?有没有办法在一个语句中包含所有linq而不是调用方法,如子选择或其他东西?

newEmployee = (from emp
               in db.employees
               select new 
               {
                   a.EmployeeID,
                   a.Username,
                   Status = emp.GetEmployeeCurrentStatus(a.Username)
               }).ToList();

这是GetEmployeeCurrentStatus,它返回员工的状态:

 public string GetEmployeeCurrentStatus(string username)
        {
            using (Entities db = new Entities())
            {
                var times = (from d in db.TimeTables
                             where d.DateTime == DateTime.Today &&
                             d.Employee.Username == username
                             select d)
                             .OrderByDescending(d => d.TimeID).FirstOrDefault();

                return (x.ClockOut == null ? "IN" : "OUT");                                
            }
        }

5 个答案:

答案 0 :(得分:3)

怎么样:

newEmployee = (db.employees.Select(emp => new
                  {
                      emp.EmployeeID,
                      emp.Username,
                      Status = db.TimeTables
                        .Where(d => d.Employee.Username == emp.Username
                          && d.DateTime == DateTime.Today)
                          .Select(x => x.ClockOut == null ? "IN" : "OUT")
                          .FirstOrDefault()
                  })).ToList();

您的尝试可能显示更清洁,功能正常。但是,它正在启动辅助数据库调用。这对可伸缩性和性能不利。我发布的版本使用相同的初始数据库连接,并将使连接1-1。这将导致更严格,更快速的查询以及更低的资源使用率。

答案 1 :(得分:2)

您无法真正调用查询中的自定义方法(或将使用数据库执行的查询的一部分)。您基本上有两种选择:

  • 在执行需要调用方法的ToList之前调用select(这样,将在内存数据中调用该方法)

  • 编写查询,以便它可以在SQL服务器上运行(如果可能)。这可以使用predicate builder中的AsExpandable扩展名来完成。有关其工作原理的详细信息,另请参阅my blog post

答案 2 :(得分:1)

它适用于小数据(员工数量),但由于每个GetEmployeeCurrentStatus都需要一个新的连接,所以它不是最好的做法。 我个人将获得所有员工(一次访问数据库),然后获得所有员工状态(一次数据库之旅),所以我兑现了所有,现在我将加入他们当地

希望这有帮助

答案 3 :(得分:0)

无论效率如何,将GetEmployeeCurrentStatus(...)作为一种方法可以使代码更清晰,更可重用。

答案 4 :(得分:0)

假设您使用的是LINQ to SQL或EF,我会重构您的查询以使用Join。这样,您将在数据库上执行单个高效的SQL查询,而不是两个单独的查询。

相关问题