網站首頁 編程語言 正文
本章節主要介紹使用WebAPI和EF框架結合,實現數據的基本操作功能。
一、資料準備
數據庫腳本:
create table Dept --部門信息
(
DeptId int primary key identity(1,1),
DeptName varchar(50) not null
)
create table Employee --員工信息
(
EmpId int primary key identity(1,1),
DeptId int not null,
EmpName varchar(50) not null,
EmpPhone varchar(50) not null,
EmpArea varchar(50) not null,
EmpSalary decimal(18,2) not null
)
insert into Dept(DeptName) values('開發部')
insert into Dept(DeptName) values('測試部')
insert into Dept(DeptName) values('實施部')
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'劉德華','13887855552','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'張學友','13556528634','深圳',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'劉亦菲','13448494546','廣州',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'周杰倫','13888666855','北京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'許巍','13868654219','上海',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'孫燕姿','13895133572','成都',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'樸樹','13458788896','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'周潤發','13554588745','南京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'李連杰','13998759654','上海',6500)
select * from Dept;
select * from Employee;
二、數據列表
API接口:
[HttpGet]
public IHttpActionResult Get()
{
var data = from emp in db.Employee
join dept in db.Dept on emp.DeptId equals dept.DeptId
select new
{
EmpId = emp.EmpId,
DeptId = emp.DeptId,
EmpName = emp.EmpName,
EmpPhone = emp.EmpPhone,
EmpArea = emp.EmpArea,
EmpSalary = emp.EmpSalary,
DeptName = dept.DeptName
};
return Json(new { res = 1, msg = "", data = data });
}
接口測試地址:
http://localhost:1894/api/Employee
三、組合條件搜索
接受搜索條件的實體:
public class SearchDto
{
public int DeptId { get; set; } //部門編號
public string EmpName { get; set; } //部門名稱
}
API接口:
[HttpGet]
[Route("api/Employee/Search")]
public IHttpActionResult Get([FromUri] SearchDto searchDto)
{
var data = from emp in db.Employee
join dept in db.Dept on emp.DeptId equals dept.DeptId
select new
{
EmpId = emp.EmpId,
DeptId = emp.DeptId,
EmpName = emp.EmpName,
EmpPhone = emp.EmpPhone,
EmpArea = emp.EmpArea,
EmpSalary = emp.EmpSalary,
DeptName = dept.DeptName
};
if (searchDto.DeptId > 0)
data = data.Where(p => p.DeptId == searchDto.DeptId);
if (!string.IsNullOrEmpty(searchDto.EmpName))
data = data.Where(p => p.EmpName.Contains(searchDto.EmpName));
return Json(new { res = 1, msg = "", data = data });
}
接口測試:
四、組合條件搜索加分頁
接受搜索條件的實體:
public class SearchDto
{
public int DeptId { get; set; } //部門編號
public string EmpName { get; set; } //部門名稱
}
API接口:
[HttpGet]
[Route("api/Employee/SearchPage")]
public IHttpActionResult Get(int page,int pagesize,[FromUri] SearchDto searchDto)
{
var query = from emp in db.Employee
join dept in db.Dept on emp.DeptId equals dept.DeptId
select new
{
EmpId = emp.EmpId,
DeptId = emp.DeptId,
EmpName = emp.EmpName,
EmpPhone = emp.EmpPhone,
EmpArea = emp.EmpArea,
EmpSalary = emp.EmpSalary,
DeptName = dept.DeptName
};
if (searchDto.DeptId > 0)
query = query.Where(p => p.DeptId == searchDto.DeptId);
if (!string.IsNullOrEmpty(searchDto.EmpName))
query = query.Where(p => p.EmpName.Contains(searchDto.EmpName));
var data = query.OrderByDescending(p => p.EmpId).ToPagedList(page, pagesize);
return Json(new { res = 1, msg = "",total=data.TotalItemCount, data = data });
}
接口測試:
五、數據的新增
API接口方案一:(直接使用EF中實體接受新增的數據)
[HttpPost]
//此處為降低前端和EF框架實體的耦合性,也可以重新定義Dto類,然后將Dto數據通過映射,賦值到EF中Employee對象中
public IHttpActionResult Add(Employee emp)
{
db.Employee.Add(emp);
int r = db.SaveChanges();
if (r == 1)
return Json(new { res = 1, msg = "添加成功" });
else
return Json(new { res = 1, msg = "添加失敗" });
}
API接口方案二:(使用Dto接受數據,直接通過屬性賦值實現Dto對象向EF實體的轉換)
public class EmpAddDto
{
public int EmpId { get; set; }
public int DeptId { get; set; }
public string EmpName { get; set; }
public string EmpPhone { get; set; }
public string EmpArea { get; set; }
public decimal EmpSalary { get; set; }
}
[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
//屬性依次賦值實現Dto對象向EF實體對象的轉換
Employee emp = new Employee();
emp.DeptId = dto.DeptId;
emp.EmpName = dto.EmpName;
emp.EmpPhone = dto.EmpPhone;
emp.EmpArea = dto.EmpArea;
emp.EmpSalary = dto.EmpSalary;
db.Employee.Add(emp);
int r = db.SaveChanges();
if (r == 1)
return Json(new { res = 1, msg = "添加成功" });
else
return Json(new { res = 1, msg = "添加失敗" });
}
API接口方案三:(通過AutoMapper組件進行映射)
AutoMapper組件可以在NuGet中進行安裝,經過測試在framework4.5中無法使用,在framework4.7.1中可以正常使用。
如果沒有安裝framework4.7.1,可以在官網下載 .NET Framework 4.7.1 Developer Pack。
如果通過項目的屬性面板中修改了目標框架為framework4.7.1,程序可能會編譯錯誤,需要修改配置文件:
compilerOptions="/langversion:6 /nowarn:1659;1699;1701"
修改成:
compilerOptions="/langversion:Default /nowarn:1659;1699;1701"
API接口代碼:(兩種類型屬性名稱完全相同的時候)
public class EmpAddDto
{
public int EmpId { get; set; }
public int DeptId { get; set; }
public string EmpName { get; set; }
public string EmpPhone { get; set; }
public string EmpArea { get; set; }
public decimal EmpSalary { get; set; }
}
[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
//兩種類型屬性名稱相同自動映射
var config = new MapperConfiguration(cfg => cfg.CreateMap<EmpAddDto, Employee>());
var mapper = config.CreateMapper();
Employee emp = mapper.Map<Employee>(dto);
db.Employee.Add(emp);
int r = db.SaveChanges();
if (r == 1)
return Json(new { res = 1, msg = "添加成功" });
else
return Json(new { res = 1, msg = "添加失敗" });
}
API接口代碼:(兩種類型屬性名稱不一致的時候)
public class EmpAddDto
{
public int EmpId { get; set; }
public int DeptId { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string EmpArea { get; set; }
public decimal EmpSalary { get; set; }
}
[HttpPost]
public IHttpActionResult Add(EmpAddDto dto)
{
//兩種類型名屬性相同自動映射
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<EmpAddDto, Employee>()
.ForMember("EmpName", opt => opt.MapFrom(src => src.Name))
.ForMember(dest => dest.EmpPhone, opt => opt.MapFrom(src => src.Phone));
//.ForMember(dest => dest.EmpId, opt => opt.MapFrom(src => src.EmpId))
//.ForMember(dest => dest.DeptId, opt => opt.MapFrom(src => src.DeptId))
//.ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name))
//.ForMember(dest => dest.EmpPhone, opt => opt.MapFrom(src => src.Phone))
//.ForMember(dest => dest.EmpArea, opt => opt.MapFrom(src => src.EmpArea))
//.ForMember(dest => dest.EmpSalary, opt => opt.MapFrom(src => src.EmpSalary));
});
var mapper = config.CreateMapper();
Employee emp = mapper.Map<Employee>(dto);
db.Employee.Add(emp);
int r = db.SaveChanges();
if (r == 1)
return Json(new { res = 1, msg = "添加成功" });
else
return Json(new { res = 1, msg = "添加失敗" });
}
接口測試:(使用EmpAddDto接受數據的時候注意參數名稱需要和EmpAddDto的屬性名相同)
原文鏈接:https://www.cnblogs.com/wml-it/p/15966355.html
相關推薦
- 2023-04-24 Android布局控件View?ViewRootImpl?WindowManagerService關
- 2022-09-19 C++四種cast使用詳細介紹_C 語言
- 2021-11-26 Linux下查看IP地址不顯示解決辦法_Linux
- 2022-05-15 C++的數據共享與保護你了解嗎_C 語言
- 2024-03-14 AOP切面編程,以及自定義注解實現切面
- 2022-09-08 Go語言中循環Loop的用法介紹_Golang
- 2023-03-01 shell?wait等待命令的具體使用_linux shell
- 2022-03-07 Go中defer使用場景及注意事項_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支