- 创建Service层、IService层、DTO层
- Service层中创建Entities文件夹,存放EF文件。在Entities文件夹中建立BaseEntity类,创建BaseService类,设置泛型,并且设置规则,泛型继承BaseEntities类,(IService中的类:IServiceSupport)
- BaseService中的代码:
public class BaseService<T> where T : BaseEntity { private OAT db; public BaseService(OAT db) { this.db = db; } /// <summary> /// 添加 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool Add(T entity) { db.Entry<T>(entity).State = EntityState.Added; return db.SaveChanges() > 0; } /// <summary> /// 修改 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool Update(T entity) { db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Modified; return db.SaveChanges() > 0; } /// <summary> /// 删除 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool Delete(T entity) { db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Deleted; return db.SaveChanges() > 0; } /// <summary> /// 查询所有 /// </summary> /// <param name="predicate"></param> /// <returns></returns> public IQueryable<T> GetLists(Expression<Func<T, bool>> predicate) { return db.Set<T>().Where(predicate); } /// <summary> /// 查询单条数据 /// </summary> /// <param name="predicate"></param> /// <returns></returns> public T Get(Expression<Func<T, bool>> predicate) { return GetLists(predicate).FirstOrDefault(); } /// <summary> /// 排序 /// </summary> /// <typeparam name="TKey"></typeparam> /// <param name="predicate"></param> /// <param name="orderBy"></param> /// <param name="isAsc"></param> /// <returns></returns> public IQueryable<T> GetList<TKey>(Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> orderBy, bool isAsc = true) { if (!isAsc) { return GetLists(predicate).OrderBy(orderBy); } else { return GetLists(predicate).OrderByDescending(orderBy); } } /// <summary> /// 分页 /// </summary> /// <typeparam name="TKey"></typeparam> /// <param name="Start"></param> /// <param name="PageSize"></param> /// <param name="RowCount"></param> /// <param name="predicate"></param> /// <param name="orderBy"></param> /// <param name="isAsc"></param> /// <returns></returns> public IQueryable<T> GetPagedList<TKey>(int Start, int PageSize, ref int RowCount, Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> orderBy, bool isAsc = true) { RowCount = GetLists(predicate).Count(); Start = Start < 1 ? 0 : Start; if (!isAsc) { return GetLists(predicate).OrderBy(orderBy).Skip(Start).Take(PageSize); } else { return GetLists(predicate).OrderByDescending(orderBy).Skip(Start).Take(PageSize); } } public static Expression<Func<T, object>> GetSortLambda<T>(string propertyPath) { var param = Expression.Parameter(typeof(T), "p"); var parts = propertyPath.Split('.'); Expression parent = param; foreach (var part in parts) { parent = Expression.Property(parent, part); } var sortExpression = Expression.Lambda<Func<T, object>>(parent, param); return sortExpression; } }
- 使用Autofac,并在Global文件中加入
//ioc配置(?) var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();//把当前程序集中的 Controller 都注册 //获取所有相关类库的程序集 Assembly[] assemblies = new Assembly[] { Assembly.Load("HPIT.TEST.Service") }; //当请求这个程序集下的接口里面的方法时候。就会返回对应的Services类里面的实现 builder.RegisterAssemblyTypes(assemblies) .Where(type => !type.IsAbstract && typeof(IServiceSupport).IsAssignableFrom(type)) .AsImplementedInterfaces().PropertiesAutowired(); //如果一个实现类中定义了其他类型的接口属性,会自动 //给属性进行“注入” //Assign:赋值 //type1.IsAssignableFrom(type2) type2是否实现了type1接口/type2是否继承自type1 //typeof(IServiceSupport).IsAssignableFrom(type)只注册实现了IServiceSupport的类 //避免其他无关的类注册到AutoFac中 var container = builder.Build(); //注册系统级别的DependencyResolver,这样当MVC框架创建Controller等对象的时候都是管Autofac要对象。 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//!!!
其中,"HPIT.TEST.Service"内容提供替换为Server类库名称
- 创建common类库,在其下创建JsonHelper和PredicateExtensions类
- JsonHelper类内容(需要引入Newtonsoft.Json.Converters;)
public static class JsonHelper { /// <summary> /// 将对象序列化为json格式字符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ToJson(this object obj) { var timeConverter = new IsoDateTimeConverter {DateTimeFormat = "yyyy-MM-dd"}; //这里使用自定义日期格式,默认是ISO8601格式 //进行序列化 1.系统自带的序列化方法 2.json.net 中 3. redis组件中 return JsonConvert.SerializeObject(obj, timeConverter); } /// <summary> /// 将json格式字符串反序列化为对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="str"></param> /// <returns></returns> public static T ToObject<T>(this string str) { if (!string.IsNullOrWhiteSpace(str)) { return JsonConvert.DeserializeObject<T>(str); } else { return default(T); } } }
ParameterReplacer内容为
internal class ParameterReplacer : ExpressionVisitor
{
public ParameterReplacer(ParameterExpression paramExpr)
{
this.ParameterExpression = paramExpr;
}
public ParameterExpression ParameterExpression { get; private set; }
public Expression Replace(Expression expr)
{
return this.Visit(expr);
}
protected override Expression VisitParameter(ParameterExpression p)
{
return this.ParameterExpression;
}
}
public static class PredicateExtensions
{
public static Expression<Func<T, object>> GetSortLambda<T>(string propertyPath)
{
var param = Expression.Parameter(typeof(T), "p");
var parts = propertyPath.Split('.');
Expression parent = param;
foreach (var part in parts)
{
parent = Expression.Property(parent, part);
}
var sortExpression = Expression.Lambda<Func<T, object>>(parent, param);
return sortExpression;
}
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
{
var candidateExpr = Expression.Parameter(typeof(T), "");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
{
var candidateExpr = Expression.Parameter(typeof(T), "");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
}
DTO中创建JobD类
public class JobD
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public DateTime? UpdateTime { get; set; }
public DateTime? CreateTime { get; set; }
}
IService中创建IJobS类
public interface IJobS : IServiceSupport
{
List<JobD> SPage(int offset, int limit, string name, string code, string sort, string order, ref int rowCount);
bool Add(JobD model);
JobD GUpd(string id);
bool Upd(JobD model);
bool Del(string str);
}
Service中创建JobS类
public class JobS:IJobS
{
public List<JobD> SPage(int offset, int limit, string name, string code, string sort, string order, ref int rowCount)
{
using (var db = new OAT())
{
BaseService<Job> bs = new BaseService<Job>(db);
rowCount = 0;
Expression<Func<Job, bool>> where = d => d.IsDel == 1;
if (!String.IsNullOrWhiteSpace(name))
{
where = where.And(r => r.Name.Contains(name));
}
if (!String.IsNullOrWhiteSpace(code))
{
where = where.And(r => r.Code == code);
}
var orderBy = Common.PredicateExtensions.GetSortLambda<Job>(sort);
bool orderType = order == "asc" ? true : false;
var list = bs.GetPagedList(offset, limit, ref rowCount, where, orderBy, orderType).Select(b => new JobD
{
Id = b.Id,
Name = b.Name,
Code = b.Code
}).ToList();
return list;
}
}
public bool Add(JobD model)
{
using (var db = new OAT())
{
BaseService<Job> bs = new BaseService<Job>(db);
Job j = new Job();
j.Id = Guid.NewGuid().ToString();
j.Name = model.Name;
j.Code = model.Code;
j.CreateTime = DateTime.Now;
j.UpdateTime = null;
j.IsDel = 1;
return bs.Add(j);
}
}
public JobD GUpd(string id)
{
using (var db = new OAT())
{
BaseService<Job> bs = new BaseService<Job>(db);
var model = bs.Get(a => a.Id == id);
JobD j = new JobD();
j.Id = model.Id;
j.Name = model.Name;
j.Code = model.Code;
return j;
}
}
public bool Upd(JobD model)
{
using (var db = new OAT())
{
BaseService<Job> bs = new BaseService<Job>(db);
var modela = db.Job.Find(model.Id);
modela.Name = model.Name;
modela.Code = model.Code;
return bs.Update(modela);
}
}
public bool Del(string str)
{
using (var db = new OAT())
{
BaseService<Job> bs = new BaseService<Job>(db);
string[] ida = str.Split(',');
for (int i = 0; i < ida.Length; i++)
{
var model = db.Job.Find(ida[i]);
model.IsDel = 0;
bs.Delete(model);
}
return true;
}
}
}
注:using Common;
页面代码
<div class="panel-body" style="padding-bottom:0px;">
<div class="panel panel-default">
<div class="panel-heading">查询条件</div>
<div class="panel-body">
<form id="formSearch" class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-1" for="txt_search_departmentname">部门名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="txtName">
</div>
<label class="control-label col-sm-1" for="txt_search_statu">状态</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="txtCode">
</div>
<div class="col-sm-4" style="text-align:left;">
<button type="button" style="margin-left:50px" id="btn_query" onclick="QueryData()" class="btn btn-primary">查询</button>
</div>
</div>
</form>
</div>
</div>
<div id="toolbar" class="btn-group">
<button id="btn_add" type="button" class="btn btn-default" data-toggle="modal" data-target="#myModal">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
</button>
<button id="btn_edit" type="button" class="btn btn-default" onclick="Upd()">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改
</button>
<button id="btn_delete" type="button" class="btn btn-default" onclick="Del()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除
</button>
</div>
<table id="tb_departments"></table>
</div>
<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">添加</h4>
</div>
<form class="form-horizontal" role="form" id="AoU">
<input type="text" hidden id="txtStatus" />
<div class="form-group">
<label for="Name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="Name"
placeholder="请输入名称">
</div>
</div>
<div class="form-group">
<label for="Code" class="col-sm-2 control-label">代码</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="Code"
placeholder="请输入代码">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="button" onclick="sub()" class="btn btn-primary" data-dismiss="modal">提交</button>
</div>
</form>
</div>
</div>
</div>
@section scripts
{
<script src="~/Content/dist/bootstrap-table.js"></script>
<link href="~/Content/dist/bootstrap-table.css" rel="stylesheet" />
<script src="~/Content/dist/locale/bootstrap-table-zh-CN.min.js"></script>
<script>
$(function () {
a();
});
function QueryData() {
$('#tb_departments').bootstrapTable('refresh', {
query: {
name: $("#txtName").val(),
code: $("#txtCode").val()
}
});
}
//模态框居中
$('#myModal').on('show.bs.modal', function () {
var $this = $(this);
var $modal_dialog = $this.find('.modal-dialog');
$this.css('display', 'block');
$modal_dialog.css({ 'margin-top': Math.max(0, ($(window).height() - $modal_dialog.height()) / 2) });
});
//关闭清空
$('#myModal').on('hidden.bs.modal',
function () {
$("#Name").val("");
$("#Code").val("");
$("#txtStatus").val("");
$("#myModalLabel").text("添加");
});
function sub() {
$.ajax({
url: $("#txtStatus").val() == "" ? "/Main/Add" : "/Main/Upd",
data: {
name: $("#Name").val(),
code: $("#Code").val(),
id: $("#txtStatus").val(),
},
success: function (data) {
if (data == "a") {
$('#myModal').modal('hide');
//{#刷新表格数据# }
$("#tb_departments").bootstrapTable('refresh');
} else {
}
}
});
}
function Upd() {
var array = $("#tb_departments").bootstrapTable('getSelections');
if (array.length < 1) {
alert("请选择");
return;
} else if (array.length > 1) {
alert("请选择一条");
return;
} else {
var str = array[0].Id;
$.ajax({
url: "/Main/GUpd",
data: {
str: str
},
dataType: "json",
success: function (data) {
$('#myModal').modal('show');
$("#myModalLabel").text("修改");
$("#Name").val(data.Name);
$("#Code").val(data.Code);
$("#txtStatus").val(data.Id);
}
});
}
}
function Del() {
var array = $("#tb_departments").bootstrapTable('getSelections');
if (array.length < 1) {
alert("请选择");
return;
}
var str = "";
for (var i = 0; i < array.length; i++) {
str += array[i].Id + ",";
}
if (str != "") {
str = str.substring(0, str.length - 1);
}
if (confirm("确认删除?")) {
$.ajax({
url: "/Main/Del",
data: {
str: str
},
success: function (data) {
if (data == "a") {
alert("删除成功");
//{#刷新表格数据# }
$("#tb_departments").bootstrapTable('refresh');
}
}
});
}
}
function a() {
$('#tb_departments').bootstrapTable({
url: '/Main/SPage', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: true, //是否启用排序
sortOrder: "asc", //排序方式
/*queryParams: oTableInit.queryParams,//传递参数(*)*/
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 3, //每页的记录行数(*)
pageList: [3, 6, 9, 12], //可供选择的每页的行数(*)
search: true, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
strictSearch: true,
showColumns: true, //是否显示所有的列
showRefresh: true, //是否显示刷新按钮
minimumCountColumns: 2, //最少允许的列数
clickToSelect: true, //是否启用点击选中行
height: 500, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
uniqueId: "ID", //每一行的唯一标识,一般为主键列
showToggle: true, //是否显示详细视图和列表视图的切换按钮
cardView: false, //是否显示详细视图
detailView: false, //是否显示父子表
columns: [{
checkbox: true
}, {
field: 'Name',
title: '职位名称',
sortable: true
}, {
field: 'Code',
title: '职位代码',
sortable: true
}]
});
}
</script>
}
控制器代码为
public class MainController : Controller
{
// GET: Main
private readonly IJobS _jobService;
public MainController(IJobS jobService)
{
_jobService = jobService;
}
public ActionResult Index()
{
return View();
}
public ActionResult SPage(int offset, int limit, string name, string sort, string order, string code)
{
int count = 0;
if (String.IsNullOrWhiteSpace(sort))
{
sort = "Id";
}
var lst = _jobService.SPage(offset, limit, name, code, sort, order, ref count);
return Json(new { total = count, rows = lst }, JsonRequestBehavior.AllowGet);
}
public ActionResult Add(JobD model)
{
bool flag = _jobService.Add(model);
if (flag)
{
return Content("a");
}
else
{
return Content("b");
}
}
public ActionResult GUpd(string str)
{
var job = _jobService.GUpd(str);
return Json(job, JsonRequestBehavior.AllowGet);
}
public ActionResult Upd(JobD model)
{
bool flag = _jobService.Upd(model);
if (flag)
{
return Content("a");
}
else
{
return Content("b");
}
}
public ActionResult Del(string str)
{
bool flag = _jobService.Del(str);
if (flag)
{
return Content("a");
}
else
{
return Content("b");
}
}
}
将Service中的App.config中链接字符串代码剪切至项目Web.config中(此位置)
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="OAT" connectionString="data source=.;initial catalog=OAGas;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
若发生未找到具有固定名称System.Data.SqlClient的ADO.NET提供程序错误
请引入EntityFramework程序包
联合查询
public List<StaffDTO> GetShowData(int offset, int limit, ref int rowCount, string sort, string order, string name, string sex, string jobName)
{
using (var db = new RentRoomDBContext())
{
//Expression<Func<Staff, bool>> where = p => p.IsDel == 1;
var sortNew = Common.PredicateExtensions.GetSortLambda<Staff>(sort);
bool orderNew = order == "asc" ? true : false;
var lst = (from a in db.Staff
join b in db.Job
on a.JobId equals b.Id
where a.IsDel == 1
select new DTO.StaffDTO
{
Id = a.Id,
Uname = a.Uname,
Pwd = a.Pwd,
Name = a.Name,
Sex = a.Sex,
Birthday = a.Birthday,
Sheng = a.Sheng,
Shi = a.Shi,
Qu = a.Qu,
Address = a.Address,
Email = a.Email,
Tel = a.Tel,
Status = a.Status,
JobId = a.Name,
CreateTime = a.CreateTime,
UpdateTime = a.UpdateTime,
IsDel = a.IsDel,
JobName = b.Name
}).ToList();
if (!string.IsNullOrWhiteSpace(name))
{
lst = lst.Where(a => a.Name.Contains(name)).ToList();
}
if (!string.IsNullOrWhiteSpace(sex))
{
int s = int.Parse(sex);
lst = lst.Where(a => a.Sex == s).ToList();
}
if (jobName != "--请选择--")
{
lst = lst.Where(h => h.JobName == jobName).ToList();
}
rowCount = lst.Count();
lst = lst.OrderBy(a => a.Id).Skip(offset).Take(limit).ToList();
return lst.ToList();
}
}