使用.net core 将存储过程的结果映射到返回对象

Map the result of stored procedure with the returning object using .net core

我是 .net 核心的新手。我从一个 Get API 调用开始,该调用将 return 作为 SP 基于员工 ID 的结果的单个员工记录。我有2个classes,一个是Employee,另一个是Address。我在这两个表之间有一个组成关系。我想要 return 包含员工详细信息以及地址列表的员工对象。所以,我的员工 class 看起来像这样:

public class Employee{
public string Name {get;set;}
....
public List<Address> Addr {get; set;}
}

我能够 return 包含员工详细信息的员工对象。但是,Addr returning null.

这是我的代码:

 public async Task<Employee> GetEmployeeDetails(int employeeid)
    {
            Employee emp;
            var dictionary = new Dictionary<string, object>
                    {
                        {"@employeeid", employeeid }
                    };

            var parameters = new DynamicParameters(dictionary);

            using (IDbConnection con = await GetConnectionAsync(ConfigHandler.GetConnectionString(Constants.DefaultConnectionString)))
            {
                emp = (Employee)await ExecuteQueryFirstOrDefaultAsync<Employee>(con, "GetEmployeeDetails", parameters);
                con.Close();
            }
            return emp;
    }

我应该使用多个结果集还是 SP 的单个结果集?即员工的结果集和地址不同,或者我应该 return 只有一个结果集。因为我对第一个地址感兴趣。其次,如何将 Sp 的结果映射到对象。 我将不胜感激 help/advice。 谢谢!

您应该创建一个如下所示的 class

    public class GetEmployeeDetailsResult 
    {
      public string Name {get;set;}
      public string Email {get;set;}
      public string Gender {get;set;}
      public string Addr {get;set;}
      public string City {get;set;}
      public string Zip {get;set;}
    }

在这个class中你可以有一个映射到Employee的方法class

public Employee MapEmployeeFromGetEmployeeDetailsResult(List<GetEmployeeDetailsResult> source)
{
  var firstElement = source.FirstOrDefault();
   return new Employee
            {
                Name = firstElement.Name,
                Email = firstElement.Email,
                Gender = firstElement.Gender,
                //this line will iterate and create the node for addresses
                Addr = source                  
                    .Select(emp => new Address
                    {
                        Addr = emp.Addr, 
                        City = emp.City,
                        Zip = emp.Zip
                    })
                    .ToList()
            };
}

然后使用此 class 作为您的 SQL 查询的 return 类型

         public async Task<Employee> GetEmployeeDetails(int employeeid)
            {
                    Employee emp;
                    var dictionary = new Dictionary<string, object>
                            {
                                {"@employeeid", employeeid }
                            };
        
                    var parameters = new DynamicParameters(dictionary);
        
                    using (IDbConnection con = await GetConnectionAsync(ConfigHandler.GetConnectionString(Constants.DefaultConnectionString)))
                    {
                        var result = await ExecuteQueryFirstOrDefaultAsync<GetEmployeeDetailsResult>(con, "GetEmployeeDetails", parameters);
                        con.Close();
                        emp = new GetEmployeeDetailsResult()
                              .MapEmployeeFromGetEmployeeDetailsResult(result);
                    }
                    return emp;    
    }

如果您不想要 new GetEmployeeDetailsResult() .MapEmployeeFromGetEmployeeDetailsResult(result); 行,您可以将方法 MapEmployeeFromGetEmployeeDetailsResult 更改为 static 并更改

new GetEmployeeDetailsResult().MapEmployeeFromGetEmployeeDetailsResult(result);

GetEmployeeDetailsResult.MapEmployeeFromGetEmployeeDetailsResult(result);