【问题标题】:How to get extra column from stored prcedure when i call in ef core当我调用 ef core 时如何从存储过程中获取额外的列
【发布时间】:2022-11-27 09:32:53
【问题描述】:
ALTER PROCEDURE [dbo].[EmployeeManagers]
@ID INT  
AS  
Begin
SET FMTONLY OFF;
WITH   subordinate AS (  

    SELECT  Id,  
            Name,  
            Surname,
            BirthDate,
            PositionId,
            ManagerId,
            CreatedDate,
            DeletedDate,
            IsDeleted,
            ModifiedDate,
            1 AS [Managing Level]  
    FROM Employees  
    WHERE Id = @ID  
   
    UNION ALL  
   
    SELECT  e.Id,  
            e.Name,  
            e.Surname,
            e.BirthDate,
            e.PositionId,
            e.ManagerId,
            e.CreatedDate,
            e.DeletedDate,
            e.IsDeleted,
            e.ModifiedDate,
           [Managing Level] + 1
    FROM Employees e  
JOIN subordinate s  
ON e.Id=s.ManagerId
)  
   
  
SELECT    
    m.Id ,  
    m.Name,  
    m.Surname,
    m.BirthDate,
    m.PositionId,
    m.ManagerId,
    m.CreatedDate,
    m.DeletedDate,
    m.IsDeleted,
    m.ModifiedDate,
    s.[Managing Level]  
FROM Employees m

JOIN subordinate s 
ON s.ManagerId = m.Id

ORDER BY [Managing Level];
end

这是我获取员工经理的存储过程。获得所有员工经理并赋予他们管理级别

        public string Name { get; set; }
      
        public string Surname { get; set; }
        
        public DateTime BirthDate { get; set; }

        public int? PositionId { get; set; }
        public Position Position { get; set; }
        public int? ManagerId { get; set; }
        public ICollection<EmployeeDepartments> EmployeeDepartments { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime? DeletedDate { get; set; }
        public bool? IsDeleted { get; set; }
        public DateTime? ModifiedDate { get; set; }
    }

这是我的员工实体

当我调用存储过程时,它只返回员工实体字段,但我也想获得管理级别


        public IQueryable<Employee> GetEmployeeManagers(int employeeId)
        {
        
            var parameter = new SqlParameter("@ID", employeeId);
            var managers = _context.Employees.FromSqlRaw("spManagersTable @ID", parameter);
            return managers;
        }

我无法获得管理级别,这是工作,但我也想获得管理级别。 我还需要在我的员工实体中获得管理级别

【问题讨论】:

  • 在您的 with 子句中,您将一个具有 Employees 表的 ID 值的过滤行与“Employees”表的其余部分合并在一起,我确信具有 ID 的过滤行会重复,因为您合并了它们。唯一的区别是联合记录的 [Managing Level] + 1。您还使用未引用的子句加入了从属表。然后,您再次将带有子句结果的“下属”与“雇员”表连接起来。我不确定您要从数据库中检索什么。你能详细说明一下吗?
  • 我试图让 Entered Employee 的所有经理

标签: sql-server entity-framework


【解决方案1】:

第一种情况,WITH 子句返回 ID 为 @ID 的 Manager 和 MangerId 为 @ID 的员工的 ID。然后,它选择仅将那些 ID 与您可能需要检索的所有列相匹配的 Employees。

WITH subordinate AS (  
    SELECT  Id,  
            1 AS [Managing Level]
    FROM Employees  
    WHERE Id = @ID
   
    UNION ALL  
   
    SELECT  Id,  
            2 AS [Managing Level] 
    FROM Employees
    WHERE ManagerId = @ID AND Id != @ID
    ORDER BY [Managing Level] ASC;
)   
  
SELECT 
    e.Name,  
    e.Surname,
    e.BirthDate,
    e.PositionId,
    e.ManagerId,
    e.CreatedDate,
    e.DeletedDate,
    e.IsDeleted,
    e.ModifiedDate,
    e.[any other column 1],
    e.[any other column 2],
    e....
FROM Employees e
INNER JOIN subordinate s ON e.Id = s.Id
ORDER BY s.[Managing Level] ASC

或者您可以简单地使用 OR 操作返回经理以及经理 ID 为 @ID 的员工:

SELECT 
    Name,  
    Surname,
    BirthDate,
    PositionId,
    ManagerId,
    CreatedDate,
    DeletedDate,
    IsDeleted,
    ModifiedDate,
    [any other column 1],
    [any other column 2],
    ..
FROM Employees
WHERE (ManagerId = @ID or Id = @ID)
ORDER BY CASE WHEN ManagerId = @ID THEN 0 ELSE 1 END ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多