ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵活的Lambda表达式组合,实现业务数据查询的多样性。

ORM-SqlRepoEx 也是一个极易使用的工具,通过在AspNetCore中的应用可以展示。

本案例源码在:

https://github.com/AzThinker/SqlRepoEx2.0DemoForAspCore

https://gitee.com/azthinker/SqlRepoEx2.0DemoForAspCore

源码部分代码是使用代码工具生成

https://github.com/AzThinker/CodeToolSolution

1、新建一个AspNetCore项目

2、通过Nuget下载SqlRepoEx库、由于本例中是AspNetCore.Mvc项目,案例中使用的是SQL Server的Northwind数据库,所以选择下载

SqlRepoEx.MsSql.ServiceCollection

3、在Startup.cs文件的public void ConfigureServices(IServiceCollection services)中添加

string ConnectionString = "Data Source=(Local);Initial Catalog=Northwind;User ID=test;Password=test";

services.AddSimpleSqlRepo(ConnectionString);

4、增加一个简单类AzCustomers,其属性来源于 Customers 表。为使SqlRepoEx 精准访问,增加特性标识  [TableName("Customers")] 。

  1. using System;
  2. using SqlRepoEx.Core.CustomAttribute;
  3.  
  4. // 客户 业务类
  5. namespace DemoTools.BLL.DemoNorthwind
  6. {
  7. [TableName("Customers")]
  8. /// <summary>
  9. /// 客户 业务类
  10. /// </summary>
  11. public sealed class AzCustomers
  12. {
  13. public string CustomerID { get; set; }
  14.  
  15. public string CompanyName { get; set; }
  16.  
  17. public string ContactName { get; set; }
  18.  
  19. public string ContactTitle { get; set; }
  20.  
  21. public string Address { get; set; }
  22.  
  23. public string City { get; set; }
  24.  
  25. public string Region { get; set; }
  26.  
  27. public string PostalCode { get; set; }
  28.  
  29. public string Country { get; set; }
  30.  
  31. public string Phone { get; set; }
  32.  
  33. public string Fax { get; set; }
  34.  
  35. }
  36. }

5、增加一人简单的列表类 AzCustomersList,其中实现了IPagedList接口,此接口是Webdiyer.WebControls.AspNetCore分页控件中定义,由于Webdiyer.WebControls.AspNetCore的源码不支持core2.1,所以重新编译,并将源码加工程中。

  1. using System;
  2. using System.Collections.Generic;
  3. using Webdiyer.WebControls.AspNetCore;
  4.  
  5. //客户列表类
  6. namespace DemoTools.BLL.DemoNorthwind
  7. {
  8. /// <summary>
  9. /// 客户 列表类
  10. /// </summary>
  11. public class AzCustomersList : List<AzCustomers>, IPagedList
  12. {
  13. public string DisplayDescription = "客户";
  14. public int PageSize { get; set; }
  15. public int TotalItemCount { get; set; }
  16. public int CurrentPageIndex { get; set; }
  17.  
  18. public static AzCustomersList GetModelList((IEnumerable<AzCustomers> QueryResult, int PageCount) queryresult, int pageSize, int currentPageIndex)
  19. {
  20. AzCustomersList models = new AzCustomersList();
  21. models.AddRange(queryresult.QueryResult);
  22. models.TotalItemCount = queryresult.PageCount;
  23. models.PageSize = pageSize;
  24. models.CurrentPageIndex = currentPageIndex;
  25. return models;
  26. }
  27. }
  28. }

6、增加一个控制器并在控制器的构造方法 AzCustomersController(IRepositoryFactory repositoryFactory),IRepositoryFactory是SqlRepoEx 工厂类的接口,由于前面(第2条中)已经注册了SqlRepoEx 所需的依赖,此处仅需在构造中加入此接口即可。

  1. using System.Linq;
  2. using DemoTools.BLL.DemoNorthwind;
  3. using Microsoft.AspNetCore.Authorization;
  4. using Microsoft.AspNetCore.Mvc;
  5. using SqlRepoEx.Abstractions;
  6.  
  7. // 客户 控制器
  8. namespace DemoTools.WebUI.DemoNorthwind.Controllers
  9. {
  10. /// <summary>
  11. /// 客户
  12. /// </summary>
  13. public class AzCustomersController : Controller
  14. {
  15. IRepositoryFactory repositoryFactory;
  16. IRepository<AzCustomers> repository;
  17. public AzCustomersController(IRepositoryFactory repositoryFactory)
  18. {
  19. this.repositoryFactory = repositoryFactory;
  20. this.repository = repositoryFactory.Create<AzCustomers>();
  21. }
  22.  
  23. /// <summary>
  24. /// 返回 客户 列表
  25. /// 异步调用数据,其异步部分明细View没有Controller只有View
  26. /// </summary>
  27. public IActionResult Index(int pageindex = )
  28. {
  29. var queryresult = repository.Query()
  30. .Select(s => s.CustomerID
  31. , s => s.CompanyName
  32. , s => s.ContactName
  33. , s => s.ContactTitle
  34. , s => s.Address
  35. , s => s.City
  36. , s => s.Region
  37. , s => s.PostalCode
  38. , s => s.Country
  39. , s => s.Phone
  40. , s => s.Fax
  41. ).OrderBy(o => o.CustomerID).Page(, pageindex).PageGo();
  42. var model = AzCustomersList.GetModelList(queryresult, , pageindex);
  43. string xrh = Request.Headers["X-Requested-With"];
  44. if (!string.IsNullOrEmpty(xrh) && xrh.Equals("XMLHttpRequest", System.StringComparison.OrdinalIgnoreCase))
  45. {
  46. return PartialView("DetailsPage", model);
  47. }
  48. return View(model);
  49. }
  50.  
  51. /// <summary>
  52. /// 增加客户
  53. /// </summary>
  54. public ActionResult Create()
  55. {
  56. var model = new AzCustomers();
  57. return View(model);
  58. }
  59.  
  60. /// <summary>
  61. /// 增加保存客户
  62. /// </summary>
  63. [HttpPost, ValidateAntiForgeryToken]
  64. [ActionName("Create")]
  65. public IActionResult CreatePost(AzCustomers model)
  66. {
  67. if (ModelState.IsValid)
  68. {
  69. repository.Insert().With(s => s.CustomerID, model.CustomerID)
  70. .With(s => s.CompanyName, model.CompanyName)
  71. .With(s => s.ContactName, model.ContactName)
  72. .With(s => s.ContactTitle, model.ContactTitle)
  73. .With(s => s.Address, model.Address)
  74. .With(s => s.City, model.City)
  75. .With(s => s.Region, model.Region)
  76. .With(s => s.PostalCode, model.PostalCode)
  77. .With(s => s.Country, model.Country)
  78. .With(s => s.Phone, model.Phone)
  79. .With(s => s.Fax, model.Fax)
  80. .Go();//按增加保存
  81. return RedirectToAction("Index");
  82. }
  83. return View(model);
  84. }
  85.  
  86. /// <summary>
  87. /// 编辑客户
  88. /// </summary>
  89. public IActionResult Edit(string Id)
  90. {
  91. var model = repository.Query()
  92. .Select(s => s.CustomerID
  93. , s => s.CompanyName
  94. , s => s.ContactName
  95. , s => s.ContactTitle
  96. , s => s.Address
  97. , s => s.City
  98. , s => s.Region
  99. , s => s.PostalCode
  100. , s => s.Country
  101. , s => s.Phone
  102. , s => s.Fax
  103. ).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
  104. return View(model);
  105. }
  106.  
  107. /// <summary>
  108. /// 保存编辑的客户
  109. /// </summary>
  110. [HttpPost, ValidateAntiForgeryToken]
  111. [ActionName("Edit")]
  112. public IActionResult EditPost(AzCustomers model)
  113. {
  114. if (ModelState.IsValid)
  115. {
  116. repository.Update().Set(s => s.CustomerID, model.CustomerID)
  117. .Set(s => s.CompanyName, model.CompanyName)
  118. .Set(s => s.ContactName, model.ContactName)
  119. .Set(s => s.ContactTitle, model.ContactTitle)
  120. .Set(s => s.Address, model.Address)
  121. .Set(s => s.City, model.City)
  122. .Set(s => s.Region, model.Region)
  123. .Set(s => s.PostalCode, model.PostalCode)
  124. .Set(s => s.Country, model.Country)
  125. .Set(s => s.Phone, model.Phone)
  126. .Set(s => s.Fax, model.Fax)
  127. .Go();//按增加保存
  128. return RedirectToAction("Index");
  129. }
  130. return View(model);
  131. }
  132.  
  133. /// <summary>
  134. /// 显示客户单个记录
  135. /// </summary>
  136. public IActionResult Details(string Id)
  137. {
  138. var model = repository.Query()
  139. .Select(s => s.CustomerID
  140. , s => s.CompanyName
  141. , s => s.ContactName
  142. , s => s.ContactTitle
  143. , s => s.Address
  144. , s => s.City
  145. , s => s.Region
  146. , s => s.PostalCode
  147. , s => s.Country
  148. , s => s.Phone
  149. , s => s.Fax
  150. ).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
  151. return View(model);
  152. }
  153.  
  154. /// <summary>
  155. /// 独立页面删除客户
  156. /// </summary>
  157. public ActionResult Delete(string Id)
  158. {
  159. var model = repository.Query()
  160. .Select(s => s.CustomerID
  161. , s => s.CompanyName
  162. , s => s.ContactName
  163. , s => s.ContactTitle
  164. , s => s.Address
  165. , s => s.City
  166. , s => s.Region
  167. , s => s.PostalCode
  168. , s => s.Country
  169. , s => s.Phone
  170. , s => s.Fax
  171. ).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
  172. return View(model);
  173. }
  174.  
  175. /// <summary>
  176. /// 独立页面删除客户
  177. /// </summary>
  178. [HttpPost, ActionName("Delete")]
  179. public IActionResult DeleteConfirmed(AzCustomers model)
  180. {
  181. repository.Delete().Where(c => c.CustomerID == model.CustomerID).Go();
  182. return RedirectToAction("Index");
  183. }
  184.  
  185. }
  186. }

7、View的实现和其他代码参见上面给出的地址中的源码。

总结:从上面看出,对特SqlRepoEx 所需要特定的操作,仅在第2、第3、第6中是必需的

(1)、引用SqlRepoEx.MsSql.ServiceCollection

(2)、 services.AddSimpleSqlRepo(ConnectionString);

(3)、 AzCustomersController(IRepositoryFactory repositoryFactory)

(4)、this.repository = repositoryFactory.Create<AzCustomers>();

然后就可以轻松的通过SqlRepoEx 访问数据库了。

轻量ORM-SqlRepoEx (七)AspNetCore应用的更多相关文章

  1. Dapper.NET——轻量ORM

    Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...

  2. SqlSugar轻量ORM

      蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...

  3. Dapper.NET—轻量ORM

    Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一 ...

  4. C# Dapper 轻量ORM调试对SQLServer

    Dapper简介 Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技 ...

  5. 轻量ORM-SqlRepoEx介绍

    轻量级 ORM-SqlRepoEx 介绍 SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的 ...

  6. 轻量ORM-SqlRepoEx (九)与Dapper共舞

    Dapper就另一个轻量ORM,Dapper及其扩展解决了数据访问端的大部门问题,提供了如数据事务管理.缓存等支持.SqlRepoEx的重点解决了Lambda转换成SQL语句,使SQL使用强类型编写, ...

  7. 轻量型ORM框架Dapper的使用

    在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...

  8. OWIN轻量型框架介绍

    OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请 ...

  9. faked 一个用于 mock 后端 API 的轻量工具

    一.简介 faked 是一个在前端开发中用于 mock 服务端接口的模块,轻量简单,无需要在本地启动 Server 也无需其它更多的资源,仅在浏览器中完成「请求拉截」,配合完整的「路由系统」轻而易举的 ...

随机推荐

  1. Hibernate 函数 ,子查询 和原生SQL查询

    一. 函数 聚合函数:count(),avg(),sum(),min(),max() 例:(1)查询Dept表中的所有的记录条数. String hql=" select count(*) ...

  2. python caser运行编码

    #!/usr/bin/env python# -*- coding:utf-8 -*-import os def encryption(): str_raw = raw_input("请输入 ...

  3. Bzoj2654:tree

    题目 Bzoj Sol 神题! 二分所有的白边减去一个值,这样做\(kruskal\)就会多选一些白边 就这样 二分范围为\([-101, 101]\)!!! # include <bits/s ...

  4. HTML5 : 文件上传下载

    网站建设中,文件上传与下载在所难免,HTML5中提供的API在前端有着丰富的应用,完美的解决了各个浏览器的兼容性问题,所以赶紧get吧! FileList 对象和 file 对象 HTML 中的 in ...

  5. CSS性能优化新属性:will-change

    ---恢复内容开始--- will-change属性通过告诉浏览器什么属性.什么元素将会发生变化,可以对这些操作进行可能性的优化,由此提高CSS动画的执行效率. 这个属性可以有4个值: auto: 实 ...

  6. sauvola二值化算法研究

    sauvola二值化算法研究   sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法 来实现.这个方法能很好的解决全局阈值方法的短 ...

  7. Fiddler给网站“优化”

    最近访问某知名网站的速度非常慢,有时候需要2分钟还没完全打开,页面展示了一半就卡住,然后等半天才继续显示下面部分.这种情况已经有几个月了,不知道是他们服务器原因还是我所在网络的问题,但是基本上在其他网 ...

  8. python(day1-11)

    day1:Python入门 day2:数字类型字符编码 day3:函数 day4:模块与包 day5:常用模块 day6:面向对象 day8:异常处理 day9:网络编程 day10:并发编程 day ...

  9. easyui datagrid行编辑中数据联动

    easyui的datagrid中行内编辑使用数据联动.即:当编辑产品编号时,该行的产品名称自动根据产品编号显示出来. 在编辑中获取当前行的索引 function getRowIndex(target) ...

  10. ASPNET MVC Error 500.19

    今天创建了一个新的ASPNET MVC 项目部署到本地, 生成成功后在浏览器中输入URL却发现报这个错 参照下面的文章我给IIS_IUSRS和IUSR(我比较懒直接everyone)赋予虚拟目录读写权 ...