使用.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);
我是 .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);