Dapper.Common基于Dapper的开源LINQ超轻量扩展

Dapper.Common

  Dapper.Common是基于Dapper的LINQ实现,支持.net core,遵循Linq语法规则、链式调用、配置简单、上手快,支持Mysql,Sqlserver(目前只实现了这两个数据库,实现其他数据库也很轻松),支持单表,多表,自定义函数等功能。源码及其简单,直白,解析Lambda只有300行左右代码。严格区分C#函数和数据库函数,你可以在表达式中调用C#函数(不推荐,推荐将计算结果保存到变量,在写入lambda表达式),性能损失在表达式编译:常量>变量>函数。损失多少可以通过ExpressionUtil.BuildExpression()来测试,几万次耗时百毫秒及别。

  开源地址:https://github.com/1448376744/Dapper.Common

  Nuget:Install-Package Dapper.Common -Version 1.5.0

0.Test

640?wx_fmt=png

640?wx_fmt=png

1.Mapper

2.Config

//在App启动时执行一次即可
SessionFactory.AddDataSource(new DataSource()
{
Name
= "mysql",
Source
= () => new SqlConnection("connectionString"),
SourceType
= DataSourceType.SQLSERVER,
UseProxy
= true//使用Session的静态代理实现,记录日志,执行耗时,线上环境建议关闭代理
});

//获取数据库上下文
using (var session = SessionFactory.GetSession("msql"))
{
//linq to sql
}

3.Insert

var entity = new User()
{
CreateTime
=DateTime.Now,
NickName
="dapper",
};
//绝大部分接口可以设置condition已决定是否执行,支持批量更新
session.From<User>().Insert(entity,condition:1>2);
//查看日志,如果出现异常,应该在catch里,查看session.Loggers
var loggers = session.Loggers;

2.Update

var entity = new User()
{
  Id=2,
  NickName="李四"
};
//更新所有字段(where id=2),支持批量,显然除NickName之外将被更新成null
session.From<User>().Update(entity);

//更新部分字段
session.From<User>()
.Set(a
=> a.NickName, "李四", condition: true)//condition为true时更新该字段
.Set(a => a.Balance, a => a.Balance + 100)//余额在原来基础增加100
.Where(a => a.Id.In(1,2,3))//将id为1,2,3的记录进行更新
.Update();

3.Delete

//删除id>5||nick_name like '%da%'
session.From<User>()
.Where(a
=>a.Id>5||a.NickName.Like("da"))
.Delete();

4.Single

  //查询全部字段
var user1 = session.From<User>()
.Where(a
=>a.Id==2)
.Single();

//查询部分字段
var user2 = session.From<User>()
.Where(a
=> a.Id == 2)
.Single(s
=>new
{
s.Id,
s.NickName
});

5.Select

 //查询:where id in(1,2,3)
var list = session.From<User>()
.Where(a
=> a.Id.In("1,2,3".Split(',')))
.Select();

6.Where

 //构建动态查询,condition: true执行,通过condition选择分支,多个where之间用 and 连接
var list = session.From<User>()
.Where(a
=> a.Id.In(1, 2, 3), condition: true)
.Where(a
=> a.NickName.Like("da"), condition: false)
.Where(a
=> a.Id > 2 || (a.NickName.Like("da") && a.Balance > 50))
.Where(
"select * from user_bill where user_bill.user_id=user.id")//同样可以当作字符串拼接工具
.Select();

7.Function

 /// <summary>
/// 自定义函数
/// </summary>
public static class MySqlFun
{
//这里使用泛型并不是必须的,只用函数名在数据库存在即可,泛型为了指定返回数据类型
[Function]//Dapper.Common严格区分C#函数和数据库函数,一定要用该特性标识数据库函数
public static T COUNT<T>(T column)
{
return default(T);
}
[Function]
public static T MAX<T>(T column)
{
return default(T);
}
[Function]
public static T DISTINCT<T>(T column)
{
return default(T);
}
   [Function]
   public static T DATE<T>(T column)
{
     return default(T);
   }
}

8.GroupBy

 var list = session.From<Order>()
.GroupBy(a
=> a.UserId)//多个条件可以new一个匿名对象,也可以并联多个group
.Having(a
=> MySqlFun.COUNT(MySqlFun.DISTINCT(a.UserId)) > 10)//count(distinct(user_id))>10
.Select(s => new
{
s.UserId,
OrderCount
= MySqlFun.COUNT(1L),//这里应该返回long int,
MaxFee = MySqlFun.MAX(s.TotalFee)
});

9.Join

 var list = session.From<Order, User>()
.Join((a, b)
=> a.UserId == b.Id, JoinType.Inner)
.GroupBy((a, b)
=> a.UserId)
.Having((a, b)
=> MySqlFun.COUNT(MySqlFun.DISTINCT(a.UserId)) > 10)//count(distinct(user_id))>10
.Select((a, b) => new
{
a.UserId,
b.NickName,
OrderCount
= MySqlFun.COUNT(1L),//这里应该返回long int,
MaxFee = MySqlFun.MAX(a.TotalFee)
});

10.SubQuery

var list = session.From<Order>()
.GroupBy(a
=> a.UserId)
.Having(a
=> MySqlFun.COUNT(MySqlFun.DISTINCT(a.UserId)) > 10)
.Select(a
=> new
{
a.UserId,
UserName
=Convert.ToString("select nick_name from user where user.id=order.user_id"),//如果这个子查询返回的是int:Convert.ToInt32(sql)
OrderCount = MySqlFun.COUNT(1L),//这里应该返回long int【这就是为什么定义成泛型函数】,
MaxFee = MySqlFun.MAX(a.TotalFee)
});

11.Page

//分页应该写在Where,Having,Group之后(如果有)
var
list = session.From<User>()
.Where(a
=>a.NickName != null)
.Page(
1,10,out long total)
.Select();

12.Take

var list = session.From<User>()
.Take(
5)
.Select();

13.Skip

//从数据库索引为1的位置(跳过1之前的记录),获取10
var
list = session.From<User>()
.Skip(
1,10)
.Select();

14.Sum

var list= session.From<User>()
.
Sum(s=>s.Balance*s.Id);

15.Exists

//内部采用exist子查询判断满足where条件的记录是否存在
var
flag = seesion.From<User>()
.Where(a
=>a.Id > 10)
.Exists();

16.OrderBy

var list1 = session.From<User>()
.Order(a
=>a.Id)
.Select();

var list2 = session.From<User>()
.GroupBy(a
=> MysqlFun.DATE(a.CreateTime))
.OrderByDescending(a
=> MysqlFun.DATE(a.CreateTime))
.Select(s
=>new
{
Date
=MysqlFun.DATE(s.CreateTime),
Count
= MysqlFun.Count(1L)
});

17.Filter

var user =new User ()
{
  Id = 12
  Balance
= 50,
  NickName
= "张三",
  CreateTime
= Datetime.Now
};
//Filter会在Insert,Update,Select,过滤掉不想要的字段
//这将不会更新余额及创建时间

var row = session.From<User>()
.Filter(f
=>new
{
f.CreateTime,
f.Balance,
})
.Update(user);

 18.Transaction

//获取数据库上下文
ISession session = null;
try
{
    session=SessionFactory.GetSession();
//开启事务
session.Open(true);
//sql
//提交事务
session.Commit();
}
catch (Exception)
{
session
?.Rollback();
throw;
}
finally
{
session
?.Close();
}

640?wx_fmt=jpeg

原文地址:https://www.cnblogs.com/chaeyeon/p/11028480.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗基环树&#xff0c;求长度>1>1>1的路径个数。 思路&#xff1a; 先考虑一棵树&#xff0c;他的答案显然是n∗(n−1)2\frac{n*(n-1)}{2}2n∗(n−1)​。因为是个基环树&#xff0c;所以先考…

.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖

我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源&#xff08;不过好消息是现在开源了&#xff09;&#xff1b;后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。而本文介绍用来替代它们的 ILRepack&#xff0c;使用 I…

4G的小程序与5G的Chromium OS?

提到桌面操作系统&#xff0c;Windows 与 macOS 自然是家喻户晓&#xff0c;稍微有点 IT 知识的人也会知道 Linux&#xff0c;而 Fuchsia 和鸿蒙&#xff08;方舟&#xff09;则还在积极开发中&#xff0c;除了这几大类比较热门的&#xff0c;当前还有一大潜力股 Chrome OS&…

Codefest 18 (rated, Div. 1 + Div. 2)-D-Valid BFS--思维--已知bfs序,求是否正确

Codefest 18 (rated, Div. 1 Div. 2)-D-Valid BFSvj地址 题意&#xff1a;给你一段bfs序列&#xff0c;让你判断是否正确 思路&#xff1a;先给节点排序&#xff08;很关键&#xff09; 我们给每一个的点的邻接表按照给出的bfs序列排序&#xff0c;排好后&#xff0c; 我跑一…

P3605 [USACO17JAN]Promotion Counting P dfs序

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个题可以用各种姿势a掉&#xff0c;树启和线段树合并都可以&#xff0c;比较无脑。下面给一个解决这种问题比较巧妙的做法。 考虑暴力怎么写&#xff0c;我们先将每个点的权值离散化一下…

推荐VSCode多语言开发,支持一键JAVA

哈喽大家周一好&#xff01;好久不见鸭&#xff0c;最近在看一本书&#xff0c;很好&#xff0c;《人类简史》&#xff0c;适合夏日星空&#xff0c;仰观宇宙之大?这个专题是“做贡献”&#xff0c;也是作为软粉&#xff0c;打算一直推广微软自己的东西&#xff0c;上一次还是…

思维--找规律--Codeforces Round #645 (Div. 2) c题

C. Celex Update 题目大意&#xff1a;给出两点的坐标&#xff0c;找出不同的路径的总数&#xff08;路径数字总和不同&#xff09; 思路&#xff1a;根据观察向下走比向右走的增加幅度加1&#xff0c;所以在第i步 向下 对sum的影响是 n-i1 所以最小数字为12。。。。y&#xf…

Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) A. Basic Diplomacy

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn个小朋友&#xff0c;让后你要在mmm天中每天都选择一个小朋友&#xff0c;给出这mmm天都可以选哪个小朋友&#xff0c;每个小朋友选的次数不超过⌈m2⌉\left \lceil \frac{m}{2} \right \rceil⌈2m​⌉…

分布式Redis的分布式锁 Redlock

引言之前自己在用redis来实现分布式锁的时候都是基于单个Redis实例&#xff0c;也就是说Redis本身是有单点故障的&#xff0c;Redis的官方文档介绍了一种"自认为"合理的算法&#xff0c;Redlock来实现分布式Redis下的分布式锁。Martin Kleppmann写了一篇文章分析Redl…

双指针--Codeforces Round #645 (Div. 2) d题

D. The Best Vacation 题目大意&#xff1a; 算出连续x天最多的拥抱&#xff0c;一个月第i号就有i个拥抱 思路&#xff1a;双指针&#xff0c;扫描过去&#xff08;每个月每个月的计算&#xff0c;最后超出的部分再一天一天算&#xff09; 代码 &#xff1a; #include<cstd…

Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path 奇偶 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给一个二维平面&#xff0c;起点在(0,0)(0,0)(0,0)&#xff0c;终点在(n,n)(n,n)(n,n)&#xff0c;每次只能往上和往右走&#xff0c;距离随意&#xff0c;总步数不超过nnn&#xff0c;每一步有一个代价cic_…

从CLR GC到CoreCLR GC看.NET Core对云原生的支持

内存分配概要前段时间在园子里看到有人提到了GC学习的重要性&#xff0c;很赞同他的观点。充分了解GC可以帮助我们更好的认识.NET的设计以及为何在云原生开发中.NET Core会占有更大的优势&#xff0c;这也是一个程序员成长到更高层次所需要经历的过程。在认识GC的过程中&#x…

Orac and LCM #641(div2) c题--求质因数次小指数

Orac and LCM cf地址 For the multiset of positive integers s{s1,s2,…,sk}, define the Greatest Common Divisor (GCD) and Least Common Multiple (LCM) of s as follow: gcd(s) is the maximum positive integer x, such that all integers in s are divisible on x. …

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) dfs + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给一张图&#xff0c;求必须经过aaa点和bbb点的路径条数。 思路&#xff1a; 通过观察我们发现&#xff0c;这个路径无非就是x−>a−>b−>yx->a->b->yx−>a−>b−>y或者x−>…

一张图带你了解 Insider Dev Tour 2019中国技术大会

点击阅读原文&#xff0c;前往微软Insider Dev Tour 全球官网

Codeforces Round #632 (Div. 2)巧用小技巧

Codeforces Round #632 (Div. 2)点这 Eugene likes working with arrays. And today he needs your help in solving one challenging task. An array c is a subarray of an array b if c can be obtained from b by deletion of several (possibly, zero or all) elements f…

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给nnn个数&#xff0c;让你构造一个尽可能大的矩阵&#xff0c;其中每个点所在的行和列都不含相等元素。 思路&#xff1a; 假设构造的答案矩阵大小为ababab且a<ba<ba<b&#xff0c;那么我们可以…

.NET项目迁移到.NET Core操作指南

这篇文章&#xff0c;汇集了大量优秀作者写的关于".NET迁移到.NET Core"资料文章以及微软官方教程文档。是我在迁移公司框架项目到.NET Core和.NET Standard时遇到的问题&#xff0c;并将相关资料整理成这篇文章。记录如何一步一步把项目迁移到.NET Core。在此感谢这…

Educational Codeforces Round 88 D. Yet Another Yet Another Task(巧枚举)

cf地址 **题目大意&#xff1a;**一个序列&#xff0c;你可以选择一个子段&#xff0c;要求去掉子段最大值后的和最大&#xff0c;求出这个最大值 **思路&#xff1a;**a[i]的范围比较小&#xff0c;可以通过枚举最大值&#xff0c;再找到最大值可以辐射的区间。经典套路了。…

Codeforces Round #607 (Div. 2) E. Jeremy Bearimy dfs + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你2∗k2*k2∗k个点的一棵树。定义GGG为任选kkk组不同的点&#xff0c;每组点的距离和的最小值。定义BBB为任选kkk组不同的点&#xff0c;每组点的距离和的最大值。让你求出GGG和BBB。 思路&#xff1a; …