只是想知道这是否是最有效的方法?有没有办法在一个语句中包含所有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");
}
}
答案 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查询,而不是两个单独的查询。