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")] 。

 using System;
using SqlRepoEx.Core.CustomAttribute; // 客户 业务类
namespace DemoTools.BLL.DemoNorthwind
{
[TableName("Customers")]
/// <summary>
/// 客户 业务类
/// </summary>
public sealed class AzCustomers
{
public string CustomerID { get; set; } public string CompanyName { get; set; } public string ContactName { get; set; } public string ContactTitle { get; set; } public string Address { get; set; } public string City { get; set; } public string Region { get; set; } public string PostalCode { get; set; } public string Country { get; set; } public string Phone { get; set; } public string Fax { get; set; } }
}

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

using System;
using System.Collections.Generic;
using Webdiyer.WebControls.AspNetCore; //客户列表类
namespace DemoTools.BLL.DemoNorthwind
{
/// <summary>
/// 客户 列表类
/// </summary>
public class AzCustomersList : List<AzCustomers>, IPagedList
{
public string DisplayDescription = "客户";
public int PageSize { get; set; }
public int TotalItemCount { get; set; }
public int CurrentPageIndex { get; set; } public static AzCustomersList GetModelList((IEnumerable<AzCustomers> QueryResult, int PageCount) queryresult, int pageSize, int currentPageIndex)
{
AzCustomersList models = new AzCustomersList();
models.AddRange(queryresult.QueryResult);
models.TotalItemCount = queryresult.PageCount;
models.PageSize = pageSize;
models.CurrentPageIndex = currentPageIndex;
return models;
}
}
}

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

 using System.Linq;
using DemoTools.BLL.DemoNorthwind;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlRepoEx.Abstractions; // 客户 控制器
namespace DemoTools.WebUI.DemoNorthwind.Controllers
{
/// <summary>
/// 客户
/// </summary>
public class AzCustomersController : Controller
{
IRepositoryFactory repositoryFactory;
IRepository<AzCustomers> repository;
public AzCustomersController(IRepositoryFactory repositoryFactory)
{
this.repositoryFactory = repositoryFactory;
this.repository = repositoryFactory.Create<AzCustomers>();
} /// <summary>
/// 返回 客户 列表
/// 异步调用数据,其异步部分明细View没有Controller只有View
/// </summary>
public IActionResult Index(int pageindex = )
{
var queryresult = repository.Query()
.Select(s => s.CustomerID
, s => s.CompanyName
, s => s.ContactName
, s => s.ContactTitle
, s => s.Address
, s => s.City
, s => s.Region
, s => s.PostalCode
, s => s.Country
, s => s.Phone
, s => s.Fax
).OrderBy(o => o.CustomerID).Page(, pageindex).PageGo();
var model = AzCustomersList.GetModelList(queryresult, , pageindex);
string xrh = Request.Headers["X-Requested-With"];
if (!string.IsNullOrEmpty(xrh) && xrh.Equals("XMLHttpRequest", System.StringComparison.OrdinalIgnoreCase))
{
return PartialView("DetailsPage", model);
}
return View(model);
} /// <summary>
/// 增加客户
/// </summary>
public ActionResult Create()
{
var model = new AzCustomers();
return View(model);
} /// <summary>
/// 增加保存客户
/// </summary>
[HttpPost, ValidateAntiForgeryToken]
[ActionName("Create")]
public IActionResult CreatePost(AzCustomers model)
{
if (ModelState.IsValid)
{
repository.Insert().With(s => s.CustomerID, model.CustomerID)
.With(s => s.CompanyName, model.CompanyName)
.With(s => s.ContactName, model.ContactName)
.With(s => s.ContactTitle, model.ContactTitle)
.With(s => s.Address, model.Address)
.With(s => s.City, model.City)
.With(s => s.Region, model.Region)
.With(s => s.PostalCode, model.PostalCode)
.With(s => s.Country, model.Country)
.With(s => s.Phone, model.Phone)
.With(s => s.Fax, model.Fax)
.Go();//按增加保存
return RedirectToAction("Index");
}
return View(model);
} /// <summary>
/// 编辑客户
/// </summary>
public IActionResult Edit(string Id)
{
var model = repository.Query()
.Select(s => s.CustomerID
, s => s.CompanyName
, s => s.ContactName
, s => s.ContactTitle
, s => s.Address
, s => s.City
, s => s.Region
, s => s.PostalCode
, s => s.Country
, s => s.Phone
, s => s.Fax
).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
return View(model);
} /// <summary>
/// 保存编辑的客户
/// </summary>
[HttpPost, ValidateAntiForgeryToken]
[ActionName("Edit")]
public IActionResult EditPost(AzCustomers model)
{
if (ModelState.IsValid)
{
repository.Update().Set(s => s.CustomerID, model.CustomerID)
.Set(s => s.CompanyName, model.CompanyName)
.Set(s => s.ContactName, model.ContactName)
.Set(s => s.ContactTitle, model.ContactTitle)
.Set(s => s.Address, model.Address)
.Set(s => s.City, model.City)
.Set(s => s.Region, model.Region)
.Set(s => s.PostalCode, model.PostalCode)
.Set(s => s.Country, model.Country)
.Set(s => s.Phone, model.Phone)
.Set(s => s.Fax, model.Fax)
.Go();//按增加保存
return RedirectToAction("Index");
}
return View(model);
} /// <summary>
/// 显示客户单个记录
/// </summary>
public IActionResult Details(string Id)
{
var model = repository.Query()
.Select(s => s.CustomerID
, s => s.CompanyName
, s => s.ContactName
, s => s.ContactTitle
, s => s.Address
, s => s.City
, s => s.Region
, s => s.PostalCode
, s => s.Country
, s => s.Phone
, s => s.Fax
).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
return View(model);
} /// <summary>
/// 独立页面删除客户
/// </summary>
public ActionResult Delete(string Id)
{
var model = repository.Query()
.Select(s => s.CustomerID
, s => s.CompanyName
, s => s.ContactName
, s => s.ContactTitle
, s => s.Address
, s => s.City
, s => s.Region
, s => s.PostalCode
, s => s.Country
, s => s.Phone
, s => s.Fax
).Where(s => s.CustomerID == Id).Go().FirstOrDefault();
return View(model);
} /// <summary>
/// 独立页面删除客户
/// </summary>
[HttpPost, ActionName("Delete")]
public IActionResult DeleteConfirmed(AzCustomers model)
{
repository.Delete().Where(c => c.CustomerID == model.CustomerID).Go();
return RedirectToAction("Index");
} }
}

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. 移动前端开发之viewport,devicePixelRatio的深入理解

    移动前端开发之viewport的深入理解 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的met ...

  2. 小任务之使用SVG画柱状图~

    function drawBar(data) { var barGraph = document.querySelector("#bar-graph"); var graphWid ...

  3. makefile 通配符了解% $@ $^ $<

    把目录下所有文件都编译的命令. 1 all:$(subst .c,.o,$(wildcard *.c)) 2 3 %.o:%.c 4 gcc -o $@ $< 下面是几个特舒符号的意思: $@: ...

  4. 安装Chrome driver/ IE driver

    2014-08-15 11:38 22100人阅读 评论(0) 收藏 举报  分类: python基础学习(97)  >>>安装Chrome driver chrome driver ...

  5. Oracle中用户和方案的区别

    从定义中我们可以看出方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一 ...

  6. 二进制中 1 的个数(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个 ...

  7. 并发包Semaphore实现信号灯

    /** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ...

  8. OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四种复制方式-单层文件夹复制

    字节流两套:         java.lang.Object--java.io.OutputStream--java.io.FileOutputStream         java.lang.Ob ...

  9. Starting MySQL.. ERROR! The server quit without updating PID file (/var/mysql/data/feng.pid). 问题解决方案

    1.首先应该想到 授权 chown -R mysql:mysql /var/mysql/data  给mysql 用户 2.vim /etc/my.cnf [mysqld] datadir = /va ...

  10. 在Ubuntu16.04.4上安装docker

    在Ubuntu16.04.4上安装docker 一.环境准备     首先我们需要一台Ubuntu16.04 虚拟机或者真机,其次,我们对其进行环境配置.       1.1.移除已经安装过的dock ...