当前位置:网站首页>C#轻量级ORM使用 Dapper+Contrib
C#轻量级ORM使用 Dapper+Contrib
2022-08-09 14:53:00 【iZaix】
C#轻量级ORM使用 Dapper+Contrib
引入Dapper+Contrib
关于Dapper
什么是Dapper
Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取器一样快。ORM是一个对象关系映射器,它负责数据库和编程语言之间的映射。
Dapper是如何工作的
它可以分为三个步骤:
- 创建一个IDbConnection接口对象;
- 编写一个查询SQL来执行CRUD操作;
- 将查询SQL作为Execute方法的参数传递。
Dapper通过扩展IDbConnection提供一些有用的扩展方法去查询您的数据库。Dapper.Contrib是对Dapper的进一步封装,使对象的基本增删改查等操作进一步简化。
引入NuGet包
Dapper通过NuGet安装:https://www.nuget.org/packages/Dapper
方法
Dapper会用以下几个方法扩展您的IDbConnection接口:
- Execute
- Query
- QueryFirst
- QueryFirstOrDefault
- QuerySingle
- QuerySingleOrDefault
- QueryMultiple
Dapper的扩展
执行sql返回一个对象
public static T ExecuteReaderReturnT<T>(string sql, object param = null, bool useWriteConn = false, IDbTransaction transaction = null)
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.QueryFirstOrDefault<T>(sql, param, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.QueryFirstOrDefault<T>(sql, param, commandTimeout: commandTimeout, transaction: transaction);
}
}
执行sql,返回影响行数
public static int ExecuteSqlInt(string sql, object param = null, IDbTransaction transaction = null)
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return conn.Execute(sql, param, commandTimeout: commandTimeout, commandType: CommandType.Text);
}
}
else
{
var conn = transaction.Connection;
return conn.Execute(sql, param, transaction: transaction, commandTimeout: commandTimeout, commandType: CommandType.Text);
}
}
根据id获取实体
public static T GetById<T>(int id, IDbTransaction transaction = null, bool useWriteConn = false) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.Get<T>(id, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
}
}
插入实体
public static long ExecuteInsert<T>(T item, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
var res = conn.Insert<T>(item, commandTimeout: commandTimeout);
return res;
}
}
else
{
var conn = transaction.Connection;
return conn.Insert(item, transaction: transaction, commandTimeout: commandTimeout);
}
}
更新实体
public static bool ExecuteUpdate<T>(T item, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return conn.Update(item, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.Update(item, transaction: transaction, commandTimeout: commandTimeout);
}
}
分页查询
public static List<T> ExecutePageList<T>(string sql, string sort, int pageIndex, int pageSize, bool useWriteConn = false, object param = null)
{
string pageSql = @"SELECT TOP {0} * FROM (SELECT ROW_NUMBER() OVER (ORDER BY {1}) _row_number_,* FROM ({2})temp )temp1 WHERE temp1._row_number_>{3} ORDER BY _row_number_";
string execSql = string.Format(pageSql, pageSize, sort, sql, pageSize * (pageIndex - 1));
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.Query<T>(execSql, param, commandTimeout: commandTimeout).ToList();
}
}
Contrib中,关于entity的配置
[Table("test")]
public class Test
{
[Key]
public int Id {
get; set; }
[ExplicitKey]
public string Sn {
get; set; }
public string Label {
get; set; }
public string Style {
get; set; }
public int Count {
get; set; }
[Computed]
public int Doublecount => Count * 2;
[Write(false)]
public int IgnoreCol {
get; set; }
public string More_info {
get; set; }
}
如上所示,test类中包含了Contrib的属性配置
- Table:指定实体对应地数据库表名,忽略后实体对应地数据库表名会相应地变化
- Key:指定此列为主键(自动增长主键),可忽略,忽略后默认查找
ExplicitKey:指定此列为主键(不自动增长类型例如guid,ExplicitKey与Key地区别下面会详细讲) - Computed:计算属性,打上此标签,对象地insert,update等操作会忽略此列
- Write:需穿一个bool值,false时insert,update等操作会忽略此列
其中,Key和ExplicitKey这两项都是指定列为主键的。区别是打上Key特性的列在插入时是不能指定值的,只能是数据库自动增长列,而ExplicitKey特性可以允许在插入时指定值,比如用guid为主键类型,则主键在插入时必须已经生成好。
边栏推荐
猜你喜欢

正则化原理的简单分析(L1/L2正则化)

DMPE-PEG-Mal Maleimide-PEG-DMPE dimyristoylphosphatidylethanolamine-polyethylene glycol-maleimide

What is the difference between the four common resistors?

Mathematica 数据分析(简明)

redis6在centos7的安装

pytorch从零搭建神经网络实现多分类(训练自己的数据集)
![[MySql]实现多表查询-一对一,一对多](/img/7e/8f1af4422a394969b28a553ead2c42.png)
[MySql]实现多表查询-一对一,一对多

Shell functions and arrays

浅析Servlet三大容器的常用方法及其作用域

Startup error: Caused by: org.apache.ibatis.binding.BindingException summary solution
随机推荐
二叉排序树的左旋与右旋
Analysis: Which method is used to build a stock quantitative trading database?
Mind map FreeMind installation problems and simple use
欢迎使用CSDN-markdown编辑器
Qt对话框中show和exec的区别
回收站一直显示未清空的图标问题
What are the misunderstandings about the programmatic trading system interface?
Seize the opportunity of quantitative trading fund products, and quantitative investment has room for development?
Similar image detection method
如何将List<Map>进行分组数值计算合并排序
docker安装单机版redis、集群版redis
MySql中什么是索引?常用的索引有哪些种类?索引在什么情况下会失效?
SNR 信噪比
用户如何正确去认识程序化交易?
How to use and execute quantitative programmatic trading?
Mysql两个引擎对比
Regular Expressions for Shell Programming
Grad CAM model visualization
职业量化交易员对量化交易有什么看法?
FilenameFilter过滤文件名