C# 从linq语句中调用函数
只是想知道这是否是最有效的方法?有没有一种方法可以将所有linq放在一条语句中,而不是调用一个方法,比如subselect之类的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
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从哪里来??应该是计时,打卡吗?