Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从linq语句中调用函数_C#_Linq_Linq To Entities - Fatal编程技术网

C# 从linq语句中调用函数

C# 从linq语句中调用函数,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,只是想知道这是否是最有效的方法?有没有一种方法可以将所有linq放在一条语句中,而不是调用一个方法,比如subselect之类的 newEmployee = (from emp in db.employees select new { a.EmployeeID, a.Username, Sta

只是想知道这是否是最有效的方法?有没有一种方法可以将所有linq放在一条语句中,而不是调用一个方法,比如subselect之类的

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");                                
            }
        }

不管效率如何,使用GetEmployeeCurrentStatus(…)作为方法会使代码更清晰、更可重用。

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

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

  • 组合查询,使其尽可能在SQL server上运行。这可以使用中的
    AsExpandable
    扩展来完成。有关其工作原理的更多信息,请参见

    • 那么:

      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();
      
      您的尝试可能看起来更干净,功能正常。但是,它正在启动一个辅助数据库调用。这将不利于可伸缩性和性能。我发布的版本使用相同的初始db连接,将使连接1-1。这将导致更紧密、更快的查询以及更低的资源使用率。

      对于小数据(员工计数)来说这很好,但由于每个
      GetEmployeeCurrentStatus
      都需要一个sql新连接,因此这不是最佳做法。 我个人将获得所有员工(一次访问数据库),然后获得所有员工状态(一次访问数据库),所以我将他们全部兑现,现在我将在本地加入他们


      希望这对您有所帮助

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

      user-我看不出该方法是如何工作的。x.clockout从哪里来??应该是计时,打卡吗?