【发布时间】:2016-05-25 13:49:23
【问题描述】:
我正在使用 Visual Studio 2015 针对 Entity Framework 6 和 SQL Server 2008 构建一个 WPF 应用程序。我有这两个表:
Employee
-----------------------------
EmployeeId
FirstName
LastName
... other columns
EmployeeStatus
-----------------------------
EmployeeStatusId
EmployeeId (Foreign Key to Employee.EmployeeId)
ValidEmployeeStatusId
应用程序需要获取所有EmployeeStatus.ValidEmployeeStatusId 不是 2 也不是 4 的员工(非活动和请假)。我已经编写了这个 LINQ 查询,但它永远运行并且永远不会返回任何结果:
var query = (from e in context.Employees
from es in context.EmployeeStatus
.Where(x => e.employeeID == x.employeeID
&& (x.validEmployeeStatusID != 2
&& x.validEmployeeStatusID != 4)
.DefaultIfEmpty()
select new EmployeeViewModel
{
EmployeeId = e.employeeID,
/* set other properties*/
});
return await Task.Run(() => new
ObservableCollection<EmployeeViewModel>(query));
我做错了什么?
更新:找出是什么让我因缓慢而死...每个EmployeeViewModel 都在其ctor 中调用数据库以填充一些ObservableCollections。将这些属性变成static 并添加了static bool;如果为假,则填充属性并将布尔值设置为真。因此,所有实例都对调用数据库的那些属性使用相同的数据。对于大约 4000 条记录而言,调用次数非常多。
【问题讨论】:
-
不太清楚你想达到什么目的。应用条件后的左连接将包括员工 have*
ValidEmployeeStatusId2 或 4。那么,如果 (A) 没有相关的EmployeeStatus记录 (B) 有相关的,查询应该返回什么EmployeeStatus记录ValidEmployeeStatusId == 2` (C) there is related `EmployeeStatus` record withValidEmployeeStatusId == 4` (D) 否则? -
谢谢,@IvanStoev。如果员工有状态,我们希望排除状态为 2 和 4 的员工。但获取所有其他员工。
-
所以每个员工记录只有一个状态记录?
-
不,员工既可以是 2 也可以是 4。别问我,这是要求 :)
-
请参阅上面的更新,了解为什么查询如此缓慢,下面提供的答案。
标签: c# .net sql-server entity-framework linq