Dev*_*per 2 c# linq entity-framework entity-framework-6
我有以下EF linq查询,以获取所有雇员或特定雇员,以防empId具有价值。
但是EF不会生成预期的查询,并且OR总是忽略条件
from employee
where employee.DepartmentId == depId && ((employee.Id == empId) || (employee.Id == null))
.ToList()
Run Code Online (Sandbox Code Playgroud)
预期查询
SELECT * FROM Employee
WHERE DepartmentId = @DepId AND (Id=@empId OR Id IS NULL)
Run Code Online (Sandbox Code Playgroud)
传递值时由EF生成的查询
SELECT * FROM Employee
WHERE DepartmentId = @DepId AND (Id=@empId)
Run Code Online (Sandbox Code Playgroud)
当值为null时,由EF生成的查询
SELECT * FROM Employee
WHERE DepartmentId = @DepId AND (Id IS NULL)
Run Code Online (Sandbox Code Playgroud)
注意:没有任何员工记录的ID值为NULL,并且它返回0而不是所有员工
如何为此编写linq Id=@empId OR Id IS NULL?
您说这是您期望的查询:
SELECT * FROM Employee
WHERE DepartmentId = @DepId AND (Id=@empId OR Id IS NULL)
Run Code Online (Sandbox Code Playgroud)
但是我非常确定它不是,因为Id它永远不会为null(在Note中也要说),因为它是该表的主键。您的意思实际上是以下查询:
SELECT * FROM Employee
WHERE DepartmentId = @DepId AND (Id=@empId OR @empId IS NULL)
Run Code Online (Sandbox Code Playgroud)
因此,如果参数为,则要绕过检查并返回所有记录NULL。请注意,这不是明智的最佳方法。当您不想按筛选时,应使用不带筛选的查询Id。恐怕这不会产生最有效的查询计划。我会用这个:
IQueryable<Employee> allDepartmentEmployees =
from employee in ...
where employee.DepartmentId == depId;
select employee;
if(empId.HasValue) // presuming it's a nullable type
{
allDepartmentEmployees = allDepartmentEmployees.Where(e => e.Id == empId.Value);
}
List<Employee> employeeList = allDepartmentEmployees.ToList();
Run Code Online (Sandbox Code Playgroud)
因此,仅在给出参数的情况下进行过滤。然后,这将仅返回一个记录。
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |