Dapper.Common
About author
Email:@qq.com
QQ:
QQGroup:
Config
DbContextFactory.AddDataSource(new DataSource()
{
Default = true,
Name = "mysql",
ConnectionFacotry = () => new MySql.Data.MySqlClient.MySqlConnection("server=localhost;user id=root;password=1024;database=test;"),
DatasourceType = DatasourceType.MYSQL,
UseProxy = true//use static proxy,for logger
});
Insert
IDbContext context = null;
try
{
context = DbContextFactory.GetDbContext();
//because set "id[isIdentity=true]",so not set "id" value
var row1 = context.From<Student>().Insert(new Student()
{
Grade = Grade.A,
CreateTime = DateTime.Now,
Name = "jack",
});
//batch added
var row2 = context.From<Student>().Insert(new List<Student>()
{
new Student()
{
Grade = Grade.C,
CreateTime = DateTime.Now,
Name = "tom",
},
new Student()
{
Grade = Grade.F,
CreateTime = DateTime.Now,
Name = "jar",
},
});
}
catch (Exception e)
{
//debug sql logger
Console.WriteLine(context.Loggers);
}
finally
{
context.Close();
}
Update
using (var context = DbContextFactory.GetDbContext())
{
//param
var age = ;
DateTime? time = null;
var sid = ; //subquery
var subquery = new SubQuery<School>()
.Where(a => a.Id == sid)
.Select(s => s.Name); var row1 = context.From<Student>()
.Set(a => a.Age, a => a.Age + age)
.Set(a => a.Name, subquery)
.Set(a => a.CreateTime, time, time != null)
.Where(a => a.Id == )
.Update(); //function
context.From<Student>()
.Set(a => a.Name, a => MysqlFun.REPLACE(a.Name, "a", "b"))
.Where(a => a.Id == )
.Update(); //lock
var student = context.From<Student>()
.Where(a => a.Id == )
.Single();
var row2 = context.From<Student>()
.Set(a => a.Age, )
.Set(a => a.Version, Guid.NewGuid().ToString())
.Where(a => a.Id == && a.Version == student.Version)
.Update(); //entity
var row3 = context.From<Student>()
.Filter(a => a.SchoolId)
.Update(new Student()
{
Id = ,
CreateTime = DateTime.Now
});
Delete
using (var context = DbContextFactory.GetDbContext())
{
var row1 = context.From<Student>()
.Where(a => a.Id == )
.Delete(); var subquery = new SubQuery<School>()
.Where(a => a.Id >= )
.Select(a => a.Id); var row2 = context.From<Student>()
.Where(a => Operator.In(a.Id, subquery))
.Delete();
}
Transaction
IDbContext dbContext = null;
try
{
dbContext = DbContextFactory.GetDbContext();
dbContext.Open(true);
dbContext.From<Student>().Insert(new Student()
{
Name="stduent1"
});
//throw new Exception("rollback");
dbContext.From<School>().Insert(new School()
{
Name = "school1"
});
dbContext.Commit();
}
catch (Exception)
{
dbContext?.Rollback();
throw;
}
finally
{
dbContext?.Close();
}
Select
//single
var student = context.From<Student>()
.Where(a => a.Id == )
.Single(); //subquery
var id = ;
var age = ;
var subquery = new SubQuery<School>()
.Where(a => a.Id >= id)
.Select(a => a.Id); //Verify that subquery parameters are written to the current query
var students2 = context.From<Student>()
.OrderBy(a => a.Age)
.Where(a => a.Id >= Operator.Any(subquery) && a.Age > age)
.Select(); //Partial columns
var students3 = context.From<Student>()
.Select(s => new
{
s.Id,
s.Age
});
Group by
var students = context.From<Student>()
.GroupBy(a => a.Age)
.Having(a => MysqlFun.Count(1L) > )
.Select(s => new
{
Count = MysqlFun.Count(1L),
s.Age,
});
Dynamic query
var param = new Student()
{
Name = "zs",
Grade = Grade.B,
SchoolId = null,
Id = null,
Type =
}; //Multiple Where Connections with AND
var students = context.From<Student>()
.Where(a => a.Id == param.Id, param.Id != null)
.Where(a => Operator.Contains(a.Name, param.Name), param.Name != null)
.Where(a => a.Grade == param.Grade, param.Grade != null)
.Where(a => a.Id > || a.Age < , param.Type == )
.Select(); var students2 = context.From<Student>()
.Where(a => a.Id == param.Id, param.Id != null)
.Where(a => a.Grade == param.Grade, param.Grade != null)
.Where(a => Operator.StartsWith(a.Name, param.Name), param.Name != null)
.Where(a => a.Id > || a.Age > , param.Type == )
.Select();
Task page
var students = context.From<Student>()
.Page(, , out long total)
.Select();
Join
var students = context.From<Student, School>()
.Join((a, b) => a.SchoolId == b.Id)
.Select((a, b) => new
{
a.Id,
StuName = a.Name,
SchName = b.Name
});
Other query
//limit 0,10
var students1 = context.From<Student>()
.Take()
.Select(); //limit 10,20
var students2 = context.From<Student>()
.Skip(, )
.Select(); //Calling functions in expressions is not recommended, but n-tier attribute access is supported
var student3 = context.From<Student>()
.Where(a => a.CreateTime == DateTime.Now.Date)
.Select();
//lock
var students4 = context.From<Student>()
.With(LockType.FOR_UPADTE)
.Select(); //exists1
var flag1 = context.From<Student>()
.Where(a => a.Id > )
.Exists(); //exists2
var subquery = new SubQuery<School>()
.Where(a => a.Id >= )
.Select(a => a.Id);
var flag2 = context.From<Student>()
.Where(a => Operator.Exists(subquery))
.Count(); //count
var count = context.From<Student>()
.Where(a => a.Id > )
.Count(); //sum
var sum = context.From<Student>()
.Where(a => a.Id > )
.Sum(s => s.Id * s.Age); //distinct
var disinct = context.From<Student>()
.Distinct()
.Select(s => s.Name);
Custom Function
step1
public static class MysqlFun
{
[Function]
public static string REPLACE(string column,string oldstr,string newstr)
{
return string.Empty;
}
[Function]
public static T Count<T>(T column)
{
return default;
} }
step2
var students = context.From<Student>()
.GroupBy(a => a.Age)
.Having(a => MysqlFun.Count(1L) > )
.Select(s => new
{
Count = MysqlFun.Count(1L),
s.Age,
});
Expression To Sql
var prefix = "@";
var values = new Dictionary<string, object>();
Expression<Func<Student,bool>> expression = s => s.Age>;
var expression = ExpressionUtil.BuildExpression(item, expression, prefix);
Object to Sql
DEMO. Case When Then Else
step1: implement
//Dapper.common doesn't care how you implement it, it only concerns the result of build.
public class Case<T> : ISqlBuilder
{
private List<Expression> _whens = new List<Expression>();
private List<string> _thens = new List<string>();
string _else = null;
public string Build(Dictionary<string, object> values, string prefix)
{
var sb = new StringBuilder();
foreach (var item in _whens)
{
var express = ExpressionUtil.BuildExpression(item, values, prefix);
sb.AppendFormat(" WHEN {0} THEN '{1}'", express, _thens[_whens.IndexOf(item)]);
}
if (_else != null)
{
sb.AppendFormat(" ELSE '{0}'", _else);
}
return string.Format("(CASE {0} END)", sb);
}
public static implicit operator string(Case<T> d) => string.Empty;
public Case<T> When(Expression<Func<T, bool>> expression)
{
new Dictionary<string, object>();
_whens.Add(expression);
return this;
}
public Case<T> Then(string value)
{
_thens.Add(value);
return this;
}
public Case<T> Else(string value)
{
_else = value;
return this;
}
}
step2: use
//case
var caseWhen = new Case<Student>()
.When(a => a.Age <= )
.Then("children")
.When(a => a.Age <= )
.Then("Youth")
.Else("Old"); //The "caseWhen" object is still an ISqlBuild instance at run time, not a string
//The engine passes in parameters and calls the "caseWhen.Build" method of the instance
var students1 = context.From<Student>()
.Where(a => caseWhen == "Old" || caseWhen == "Youth")
.Select(s => new
{
s.Id,
GroupAge = (string)caseWhen
});
DEMO. Complex Function
step1: implement
public class DateAdd<T> : ISqlBuilder
{
public string Column { get; set; }
public int Expr { get; set; }
public string Unit { get; set; }
public Dictionary<string, object> Values { get; set; } public string Build(Dictionary<string, object> values, string prefix)
{
return "DATE_ADD(" + Column + ",INTERVAL " + Expr + " " + Unit + ")";
}
public DateAdd(Expression<Func<T, DateTime?>> column, int expr, string unit)
{
this.Column = ExpressionUtil.BuildColumn(column, null, null).FirstOrDefault().Value;
this.Expr = expr;
this.Unit = unit;
}
public static bool operator <(DateTime? t1, DateAdd<T> t2)
{
return false;
}
public static bool operator <(DateAdd<T> t1, DateTime? t2)
{
return false;
}
public static bool operator >(DateTime? t1, DateAdd<T> t2)
{
return false;
}
public static bool operator >(DateAdd<T> t1, DateTime? t2)
{
return false;
}
public static explicit operator DateTime(DateAdd<T> d) => DateTime.Now;
}
step2: use
var adddayfun = new DateAdd<Student>(a => a.CreateTime, , "day"); //in columus
var student1 = context.From<Student>()
.Select(s => new
{
s.Id,
DateTime = (DateTime)adddayfun //just for type inference
}); //in expression
var student2 = context.From<Student>()
.Where(a => adddayfun > DateTime.Now)
.Select();
DEMO. Window Function
step1: implement
public class WinFun<T> : ISqlBuilder
{
string _partition { get; set; }
string _orderby { get; set; }
private string _methodName { get; set; }
public WinFun<T> ROW_NUMBER()
{
_methodName = nameof(ROW_NUMBER);
return this;
}
public WinFun<T> PARTITION<TResult>(Expression<Func<T, TResult>> columns)
{
var cls = ExpressionUtil.BuildColumns(columns, null, null);
_partition += string.Join(",", cls.Select(s => s.Value));
return this;
}
public WinFun<T> ORDERBY<TResult>(Expression<Func<T, TResult>> columns, bool asc = true)
{
var cls = ExpressionUtil.BuildColumns(columns, null, null);
_orderby += string.Join(",", cls.Select(s => s.Value));
_orderby += !asc ? "DESC" : "ASC";
return this;
}
/*If there are no parameters in the expression, there is no need to build in build-method*/
public string Build(Dictionary<string, object> values, string prefix)
{
if (_methodName == nameof(ROW_NUMBER))
{
return string.Format("ROW_NUMBER()OVER(ORDER BY {0})", _orderby);
}
throw new NotImplementedException();
} public static implicit operator ulong(WinFun<T> d) => ;
}
step2: use
var winFun = new WinFun<Student>()
.ORDERBY(a => a.Age)
.ROW_NUMBER(); var student1 = context.From<Student>()
.Select(s => new
{
s.Id,
s.Name,
s.Age,
RowNum = (ulong)winFun
}); DEMO. Subquery
step1: implement
public class SubQuery<T> : ISubQuery where T : class
{
private Expression _where { get; set; }
private Expression _column { get; set; }
private string _method { get; set; }
private bool _useSignTable = true;
public string Build(Dictionary<string, object> values, string prefix)
{
var table = EntityUtil.GetTable<T>();
var column = ExpressionUtil.BuildColumn(_column, values, prefix).SingleOrDefault().Value;
var where = ExpressionUtil.BuildExpression(_where, values, prefix, _useSignTable);
if (_method == nameof(this.Select))
{
return string.Format("(select {0} from {1} where {2})", column, table.TableName, where);
}
if (_method == nameof(this.Count))
{
return string.Format("(select count({0}) from {1} where {2})", column, table.TableName, where);
}
throw new NotImplementedException();
}
public SubQuery<T> Where(Expression<Func<T, bool>> expression)
{
_where = expression;
return this;
}
public SubQuery<T> Where<T1, T2>(Expression<Func<T1, T2, bool>> expression)
{
_useSignTable = false;
_where = expression;
return this;
}
public SubQuery<T> Select<TResut>(Expression<Func<T, TResut>> expression)
{
_method = nameof(this.Select);
_column = expression;
return this;
}
public SubQuery<T> Count<TResut>(Expression<Func<T, TResut>> expression)
{
_method = nameof(this.Count);
_column = expression;
return this;
} public override bool Equals(object obj)
{
return obj is SubQuery<T> query &&
EqualityComparer<Expression>.Default.Equals(_where, query._where) &&
EqualityComparer<Expression>.Default.Equals(_column, query._column) &&
_method == query._method;
} public override int GetHashCode()
{
return HashCode.Combine(_where, _column, _method);
} public static bool operator <(object t1, SubQuery<T> t2)
{
return false;
}
public static bool operator ==(object t1, SubQuery<T> t2)
{
return false;
}
public static bool operator !=(object t1, SubQuery<T> t2)
{
return false;
}
public static bool operator <=(object t1, SubQuery<T> t2)
{
return false;
}
public static bool operator >=(object t1, SubQuery<T> t2)
{
return false;
}
public static bool operator >(object t1, SubQuery<T> t2)
{
return false;
} public static explicit operator string(SubQuery<T> v)=> string.Empty; } step2: use
//in where
var subquery1 = new SubQuery<Student>()
.Where(a => a.Id <= )
.Select(s => s.Age); var student1 = context.From<Student>()
.Where(a=>a.Age>=Operator.Any(subquery1))
.Select(); //in columns
var subquery2 = new SubQuery<School>()
.Where<Student,School>((a,b) => a.SchoolId==b.Id)
.Select(s => s.Name); var student2 = context.From<Student>()
.Select(s=>new
{
s.Id,
StudentName = s.Name,
SchoolName = (string)subquery2//just for build
});

dapper.common新增概念object to sql的更多相关文章

  1. Dapper扩展Dapper.Common框架 Linq To Sql 底层源码.net ORM框架

    源代码:https://github.com/1448376744/Dapper.CommonNUGET: Dapper.CommonQQ群:642555086 一.基本结构,此处可用委托,或动态代理 ...

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

    Dapper.Common Dapper.Common是基于Dapper的LINQ实现,支持.net core,遵循Linq语法规则.链式调用.配置简单.上手快,支持Mysql,Sqlserver(目 ...

  3. 动软生成Model(dapper.common)

    <#@ template language="c#" HostSpecific="True" #><#@ output extension= ...

  4. Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real

    Razor视图引擎布局   不需要像过去aspx一样,使用.Master文件,而是统一使用.cshtml 或 .vbhtml文件.但文件名一般以 _开头,这样做文件不会当做View显示出来 使用@Re ...

  5. dapper之连接数据库(Oracle,SQL Server,MySql)

    因为项目需求,需要项目同时可以访问三个数据库,因此本人经过一番研究,得出以下代码. 1.建立公共连接抽象类(DataBase) public abstract class DataBase { /// ...

  6. javascript——对象的概念——Object(未完)

    http://www.blogjava.net/zkjbeyond/archive/2006/04/16/41336.html javascript中对象只包括属性和方法两种成员.ECMA-262 把 ...

  7. zencart新增configuration商店全局变量sql

    将下面代码中的 '新增商店变量1', 'ADDS_NAME_1', '新增商店变量1的值', '新增商店变量1描述'换成你需要新增的内容即可. INSERT INTO `configuration` ...

  8. 原生dapper中新增用户后根据用户id,在用户角色表中添加关联数据,事务处理

    var result = 0; var userId = 0; using (var db = _Sql.Connection) using (var tran =db.BeginTransactio ...

  9. Mybatis 新增修改一条SQL

    如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值 ...

随机推荐

  1. centos自动同步服务器时间

    原文:https://my.oschina.net/yysue/blog/1628733 1.安装ntpdate yum install ntpdate -y 2.测试是否正常 ntpdate cn. ...

  2. maven中,dependency 中的 classifier属性

    classifier元素用来帮助定义构件输出的一些附属构件.附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar 该项目可能还会通过使用一些插件生成 如 kimi-app-2.0. ...

  3. Graph Embedding总结

    图嵌入应用场景:可用于推荐,节点分类,链接预测(link prediction),可视化等场景 一.考虑网络结构 1.DeepWalk (KDD 2014) (1)简介 DeepWalk = Rand ...

  4. JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(三)

    未完待续 ........ 前言: 大企鹅的日常分享,第三步,最近一直在想策略设计模式和工厂模式结合优化ifelse的写法,看了很多资料,终于写出了自己要写的东西,在这段时间里,也有求助小伙伴,但是, ...

  5. Java多态中成员的调用的特殊情况

    1.当子类和父类中有相同的成员属性的时候 public class Demo { public static void main(String[] args) { Father son=new Son ...

  6. postgresql plv8 安装

    网上可以看到pg 9.6 版本的plv8容器镜像,没有pg 高版本的支持镜像,但是在基于原有dockerfile 进行构建的时候,居然失败了,有墙的问题,有版本的问题 所以通过虚拟机尝试下构建方式安装 ...

  7. 《深度学习框架PyTorch:入门与实践》读书笔记

    https://github.com/chenyuntc/pytorch-book Chapter2 :PyTorch快速入门 + Chapter3: Tensor和Autograd + Chapte ...

  8. centos7 中iptables、firewalld 和 netfilter 的关系

    centos7系统使用firewalld服务替代了iptables服务,但是依然可以使用iptables来管理内核的netfilter 但其实iptables服务和firewalld服务都不是真正的防 ...

  9. 熟悉 rsync 的功能及其特点

    提要 熟悉 rsync 的功能及其特点 掌握 rsync 语法及常用选项的功能 掌握 rsync 命令的三种基本使用方法 掌握如何筛选 rsync 的传输目标 掌握使用 rsync 进行镜像和增量备份 ...

  10. 团队作业第五次—项目冲刺-Day1

    Day1 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 hunter--冲刺集合 团队名称 hunter小组 作业目标 最终做出 ...