MySqlSugar 3.X API

作为支持.NET CORE 为数不多的ORM之一,除了具有优越的性能外,还拥有强大的功能,不只是满足你的增,删,查和改。实质上拥有更多你想像不到的功能,当你需要实现某个功能时会发现有这个功能太棒了。

所有版本

ASP.NET 4.0+ MSSQL https://github.com/sunkaixuan/SqlSugar

ASP.NET CORE MSSQL https://github.com/sunkaixuan/ASP_NET_CORE_ORM_SqlSugar

ASP.NET 4.0+ MYSQL https://github.com/sunkaixuan/MySqlSugar

ASP.NET CORE MYSQL https://github.com/sunkaixuan/ASP_NET_CORE_ORM_MySqlSugar

ASP.NET 4.0+ Sqlite https://github.com/sunkaixuan/SqliteSugar

ASP.NET CORE Sqlite https://github.com/sunkaixuan/ASP_NET_CORE_ORM_MySqlSugar

ASP.NET 4.0+ ORACLE https://github.com/sunkaixuan/OracleSugar

优点

SqlSugar 是一款小巧,并且功能齐全的ORM,并不需要像Dapper一样依赖第三方扩展

SqlSugar 语法易用简单 ,有漂亮的拉姆达语法,也支持Dapper SQL和ADO.NET(存储过程等)的所有功能

SqlSugar 性能达到原生水准,远超 Dapper和EF CORE。

SqlSugar 支持.NET CORE , 多个数据库

SqlSugar 体积小巧只有150K是EF的30分之1 ,NUGET直接可以下载

连接数据库

1.简单用法

using(var db = new SqlSugarClient(ConnectionString)){

    //use object
var list=db.Queryable<T>().ToList(); }

2.打包用法,推荐

/// <summary>
/// SqlSugar
/// </summary>
public class SugarDao
{
private SugarDao()
{ }
public static string ConnectionString
{
get
{
string reval = "server=.;uid=sa;pwd=sasa;database=SqlSugarTest";
return reval;
}
}
public static SqlSugarClient GetInstance()
{
var db = new SqlSugarClient(ConnectionString);
db.IsEnableLogEvent = true;//Enable log events
db.LogEventStarting = (sql, par) => { Console.WriteLine(sql + " " + par+"\r\n"); };
return db;
}
}

使用打包对象

using (var db = SugarDao.GetInstance())
{
var list=db.Queryable<T>().ToList();
}

3.高级玩法,基于IOC和指挥官模式的DEMO

https://github.com/sunkaixuan/ASPNETMVCCRUDDEMO

查询

1. Queryable 拉姆达查询

                //查询所有
var student = db.Queryable<Student>().ToList();
var studentDynamic = db.Queryable<Student>().ToDynamic();
var studentJson = db.Queryable<Student>().ToJson(); //查询单条
var single = db.Queryable<Student>().Single(c => c.id == 1);
//查询单条根据主键
var singleByPk = db.Queryable<Student>().InSingle(1);
//查询单条没有记录返回空对象
var singleOrDefault = db.Queryable<Student>().SingleOrDefault(c => c.id == 11111111);
//查询单条没有记录返回空对象
var single2 = db.Queryable<Student>().Where(c => c.id == 1).SingleOrDefault(); //查询第一条
var first = db.Queryable<Student>().Where(c => c.id == 1).First();
var first2 = db.Queryable<Student>().Where(c => c.id == 1).FirstOrDefault(); //取11-20条
var page1 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy(it => it.id).Skip(10).Take(10).ToList(); //取11-20条 等于 Skip(pageIndex-1)*pageSize).Take(pageSize) 等于 between (pageIndex-1)*pageSize and pageIndex*pageSize
var page2 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy(it => it.id).ToPageList(2, 10); //查询条数
var count = db.Queryable<Student>().Where(c => c.id > 10).Count(); //从第2条开始以后取所有
var skip = db.Queryable<Student>().Where(c => c.id > 10).OrderBy(it => it.id).Skip(2).ToList(); //取前2条
var take = db.Queryable<Student>().Where(c => c.id > 10).OrderBy(it => it.id).Take(2).ToList(); //Not like
string conval = "a";
var notLike = db.Queryable<Student>().Where(c => !c.name.Contains(conval.ToString())).ToList(); //Like
conval = "三";
var like = db.Queryable<Student>().Where(c => c.name.Contains(conval)).ToList(); //支持字符串Where 让你解决,更复杂的查询
var student12 = db.Queryable<Student>().Where(c => "a" == "a").Where("id>@id", new { id = 1 }).ToList();
var student13 = db.Queryable<Student>().Where(c => "a" == "a").Where("id>100 and id in( select 1)").ToList(); //存在记录反回true,则否返回false
bool isAny100 = db.Queryable<Student>().Any(c => c.id == 100);
bool isAny1 = db.Queryable<Student>().Any(c => c.id == 1); //获取最大Id
object maxId = db.Queryable<Student>().Max(it => it.id);
int maxId1 = db.Queryable<Student>().Max(it => it.id).ObjToInt();//拉姆达
int maxId2 = db.Queryable<Student>().Max<int>("id"); //字符串写法 //获取最小
int minId1 = db.Queryable<Student>().Where(c => c.id > 0).Min(it => it.id).ObjToInt();//拉姆达
int minId2 = db.Queryable<Student>().Where(c => c.id > 0).Min<int>("id");//字符串写法 //order By
var orderList = db.Queryable<Student>().OrderBy("id desc,name asc").ToList();//字符串支持多个排序
//可以多个order by表达示
var order2List = db.Queryable<Student>().OrderBy(it => it.name).OrderBy(it => it.id, OrderByType.desc).ToList(); // order by name as ,order by id desc //In
var intArray = new[] { "5", "2", "3" };
var intList = intArray.ToList();
var listnew = db.Queryable<Student>().Where(it => intArray.Contains(it.name)).ToList();
var list0 = db.Queryable<Student>().In(it => it.id, 1, 2, 3).ToList();
var list1 = db.Queryable<Student>().In(it => it.id, intArray).ToList();
var list2 = db.Queryable<Student>().In("id", intArray).ToList();
var list3 = db.Queryable<Student>().In(it => it.id, intList).ToList();
var list4 = db.Queryable<Student>().In("id", intList).ToList();
var list6 = db.Queryable<Student>().In(intList).ToList();//不设置字段默认主键 //分组查询
var list7 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy(it => it.sex).Select("sex,count(*) Count").ToDynamic();
var list8 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy(it => it.sex).GroupBy(it => it.id).Select("id,sex,count(*) Count").ToDynamic();
List<StudentGroup> list9 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy(it => it.sex).Select<StudentGroup>("Sex,count(*) Count").ToList();
List<StudentGroup> list10 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy("sex").Select<StudentGroup>("Sex,count(*) Count").ToList();
//SELECT Sex,Count=count(*) FROM Student WHERE 1=1 AND (id < 20) GROUP BY Sex --生成结果 //2表关联查询
var jList = db.Queryable<Student>()
.JoinTable<School>((s1, s2) => s1.sch_id == s2.id) //默认left join
.Where<School>((s1, s2) => s1.id == 1)
.Select("s1.*,s2.name as schName")
.ToDynamic(); /*等于同于
SELECT s1.*,s2.name as schName
FROM [Student] s1
LEFT JOIN [School] s2 ON s1.sch_id = s2.id
WHERE s1.id = 1 */ //2表关联查询并分页
var jList2 = db.Queryable<Student>()
.JoinTable<School>((s1, s2) => s1.sch_id == s2.id) //默认left join
//如果要用inner join这么写
//.JoinTable<School>((s1, s2) => s1.sch_id == s2.id ,JoinType.INNER)
.Where<School>((s1, s2) => s1.id > 1)
.OrderBy(s1 => s1.name)
.Skip(10)
.Take(20)
.Select("s1.*,s2.name as schName")
.ToDynamic(); //3表查询并分页
var jList3 = db.Queryable<Student>()
.JoinTable<School>((s1, s2) => s1.sch_id == s2.id) // left join School s2 on s1.id=s2.id
.JoinTable<School>((s1, s3) => s1.sch_id == s3.id) // left join School s3 on s1.id=s3.id
.Where<School>((s1, s2) => s1.id > 1) // where s1.id>1
.Where(s1 => s1.id > 0)
.OrderBy<School>((s1, s2) => s1.id) //order by s1.id 多个order可以 .oderBy().orderby 叠加
.Skip(10)
.Take(20)
.Select("s1.*,s2.name as schName,s3.name as schName2")//select目前只支持这种写法
.ToDynamic(); //上面的方式都是与第一张表join,第三张表想与第二张表join写法如下
List<V_Student> jList4 =
db.Queryable<Student>()
.JoinTable<School>((s1, s2) => s1.sch_id == s2.id) // left join School s2 on s1.id=s2.id
.JoinTable<School, Area>((s1, s2, a1) => a1.id == s2.AreaId)// left join Area a1 on a1.id=s2.AreaId 第三张表与第二张表关联
.JoinTable<Area, School>((s1, a1, s3) => a1.id == s3.AreaId)// left join School s3 on a1.id=s3.AreaId 第四第表第三张表关联
.JoinTable<School>((s1, s4) => s1.sch_id == s4.id) // left join School s2 on s1.id=s4.id
.Select<School, Area, V_Student>((s1, s2, a1) => new V_Student { id = s1.id, name = s1.name, SchoolName = s2.name, AreaName = a1.name }).ToList(); //等同于
//SELECT id = s1.id, name = s1.name, SchoolName = s2.name, AreaName = a1.name
//FROM [Student] s1
//LEFT JOIN School s2 ON ( s1.sch_id = s2.id )
//LEFT JOIN Area a1 ON ( a1.id = s2.AreaId ) //第三张表与第二张表关联
//LEFT JOIN School s3 ON ( a1.id = s3.AreaId ) //第四张表与第三张表关联
//LEFT JOIN School s4 ON ( s1.sch_id = s4.id )
//WHERE 1=1 //Join子查询语句加分页的写法
var childQuery = db.Queryable<Area>().Where("id=@id").Select(it => new { id = it.id }).ToSql();//创建子查询SQL
string childTableName =SqlSugarTool.PackagingSQL(childQuery.Key);//将SQL语句用()包成表
var queryable = db.Queryable<Student>()
.JoinTable<School>((s1, s2) => s1.sch_id == s2.id) //LEFT JOIN School s2 ON ( s1.sch_id = s2.id )
.JoinTable(childTableName, "a1", "a1.id=s2.areaid", new { id = 1 }, JoinType.INNER) //INNER JOIN (SELECT * FROM [Area] WHERE 1=1 AND id=@id ) a1 ON a1.id=s2.areaid
.OrderBy(s1 => s1.id); var list = queryable.Select<School, Area, V_Student>((s1, s2, a1) => new V_Student { id = s1.id, name = s1.name, SchoolName = s2.name, AreaName = a1.name })
.ToPageList(0, 200);
var count2 = queryable.Count(); //拼接例子
var queryable2 = db.Queryable<Student>().Where(it => true);
if (maxId.ObjToInt() == 1)
{
queryable2.Where(it => it.id == 1);
}
else
{
queryable2.Where(it => it.id == 2);
}
var listJoin = queryable2.ToList(); //queryable和SqlSugarClient解耦
var par = new Queryable<Student>().Where(it => it.id == 1);//声名没有connection对象的Queryable
par.DB = db;
var listPar = par.ToList(); //查看生成的sql和参数
var id = 1;
var sqlAndPars = db.Queryable<Student>().Where(it => it.id == id).OrderBy(it => it.id).ToSql(); //拉姆达支持的函数操作
var par1 = "2015-1-1"; var par2 = " 我 有空格A, ";
var r1 = db.Queryable<Student>().Where(it => it.name == par1.ObjToString()).ToList(); //ObjToString会将null转转成""
var r2 = db.Queryable<InsertTest>().Where(it => it.d1 == par1.ObjToDate()).ToList();
var r3 = db.Queryable<InsertTest>().Where(it => it.id == 1.ObjToInt()).ToList();//ObjToInt会将null转转成0
var r4 = db.Queryable<InsertTest>().Where(it => it.id == 2.ObjToDecimal()).ToList();
var r5 = db.Queryable<InsertTest>().Where(it => it.id == 3.ObjToMoney()).ToList();
var r6 = db.Queryable<InsertTest>().Where(it => it.v1 == par2.Trim()).ToList();
var convert1 = db.Queryable<Student>().Where(c => c.name == "a".ToString()).ToList();
var convert2 = db.Queryable<Student>().Where(c => c.id == Convert.ToInt32("1")).ToList();
var convert3 = db.Queryable<Student>().Where(c => c.name == par2.ToLower()).ToList();
var convert4 = db.Queryable<Student>().Where(c => c.name == par2.ToUpper()).ToList();
var convert5= db.Queryable<Student>().Where(c => DateTime.Now > Convert.ToDateTime("2015-1-1")).ToList();
var c1 = db.Queryable<Student>().Where(c => c.name.Contains("a")).ToList();
var c2 = db.Queryable<Student>().Where(c => c.name.StartsWith("a")).ToList();
var c3 = db.Queryable<Student>().Where(c => c.name.EndsWith("a")).ToList();
var c4 = db.Queryable<Student>().Where(c => !string.IsNullOrEmpty(c.name)).ToList();
var c5 = db.Queryable<Student>().Where(c => c.name.Equals("小杰")).ToList();
var c6 = db.Queryable<Student>().Where(c => c.name.Length > 4).ToList();
var time = db.Queryable<InsertTest>().Where(c => c.d1>DateTime.Now.AddDays(1)).ToList();
var time2 = db.Queryable<InsertTest>().Where(c => c.d1 > DateTime.Now.AddYears(1)).ToList();
var time3 = db.Queryable<InsertTest>().Where(c => c.d1 > DateTime.Now.AddMonths(1)).ToList();

  

2. SqlQuery 原生SQL查询

                //转成list
List<Student> list1 = db.SqlQuery<Student>("select * from Student");
//转成list带参
List<Student> list2 = db.SqlQuery<Student>("select * from Student where id=@id", new { id = 1 });
//转成dynamic
dynamic list3 = db.SqlQueryDynamic("select * from student");
//转成json
string list4 = db.SqlQueryJson("select * from student");
//返回int
var list5 = db.SqlQuery<int>("select id from Student limit 0,1").SingleOrDefault();
//反回键值
Dictionary<string, string> list6 = db.SqlQuery<KeyValuePair<string, string>>("select id,name from Student").ToDictionary(it => it.Key, it => it.Value);
//反回List<string[]>
var list7 = db.SqlQuery<string[]>("select id,name from Student limit 0,1").SingleOrDefault();
//存储过程
//var spResult = db.SqlQuery<School>("exec sp_school @p1,@p2", new { p1 = 1, p2 = 2 }); //存储过程加Output
//var pars = SqlSugarTool.GetParameters(new { p1 = 1,p2=0 }); //将匿名对象转成SqlParameter
//db.IsClearParameters = false;//禁止清除参数
//pars[1].Direction = ParameterDirection.Output; //将p2设为 output
//var spResult2 = db.SqlQuery<School>("exec sp_school @p1,@p2 output", pars);
//db.IsClearParameters = true;//启用清除参数
//var outPutValue = pars[1].Value;//获取output @p2的值 ////存储过程优化操作
//var pars2 = SqlSugarTool.GetParameters(new { p1 = 1, p2 = 0 }); //将匿名对象转成SqlParameter
//db.CommandType = CommandType.StoredProcedure;//指定为存储过程可比上面少写EXEC和参数
//var spResult3 = db.SqlQuery<School>("sp_school", pars2);
//db.CommandType = CommandType.Text;//还原回默认 //获取第一行第一列的值
string v1 = db.GetString("select '张三' as name");
int v2 = db.GetInt("select 1 as name");
double v3 = db.GetDouble("select 1 as name");
decimal v4 = db.GetDecimal("select 1 as name");

  

3.Sqlable 高级SQL拼接器

                //多表查询
List<School> dataList = db.Sqlable()
.From("school", "s")
.Join("student", "st", "st.id", "s.id", JoinType.INNER)
.Join("student", "st2", "st2.id", "st.id", JoinType.LEFT)
.Where("s.id>100 and s.id<@id")
.Where("1=1")//可以多个WHERE
.OrderBy("id")
.SelectToList<School/*新的Model我这里没有所以写的School*/>("st.*", new { id = }); //多表分页
List<School> dataPageList = db.Sqlable()
.From("school", "s")
.Join("student", "st", "st.id", "s.id", JoinType.INNER)
.Join("student", "st2", "st2.id", "st.id", JoinType.LEFT)
.Where("s.id>100 and s.id<100")
.SelectToPageList<School>("st.*", "s.id", , ); //多表分页WHERE加子查询
List<School> dataPageList2 = db.Sqlable()
.From("school", "s")
.Join("student", "st", "st.id", "s.id", JoinType.INNER)
.Join("student", "st2", "st2.id", "st.id", JoinType.LEFT)
.Where("s.id>100 and s.id<100 and s.id in (select 1 )" /*这里面写子查询都可以*/)
.SelectToPageList<School>("st.*", "s.id", , ); //--------转成List Dynmaic 或者 Json-----// //不分页
var list1 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToDynamic("*", new { id = });
var list2 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToJson("*", new { id = });
var list3 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToDataTable("*", new { id = }); //分页
var list4 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageDynamic("s.*", "l.id", , , new { id = });
var list5 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageTable("s.*", "l.id", , , new { id = });
var list6 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageDynamic("s.*", "l.id", , , new { id = }); //--------拼接-----//
Sqlable sable = db.Sqlable().From<Student>("s").Join<School>("l", "s.sch_id", "l.id", JoinType.INNER);
string name = "a";
int id = ;
if (!string.IsNullOrEmpty(name))
{
sable = sable.Where("s.name=@name");
}
if (!string.IsNullOrEmpty(name))
{
sable = sable.Where("s.id=@id or s.id=100");
}
if (id > )
{
sable = sable.Where("l.id in(1)");//where加子查询
}
var pars = new { id = id, name = name };
int pageCount = sable.Count(pars);
var list7 = sable.SelectToPageList<Student>("s.*", "l.id desc", , , pars);

插入

支持了高性能批量插入,让你事办功倍

 db.Insert(GetInsertItem()); //插入一条记录 (有主键也好,没主键也好,有自增列也好都可以插进去)

                db.InsertRange(GetInsertList()); //批量插入 支持(别名表等功能)

                db.SqlBulkCopy(GetInsertList()); //批量插入 适合海量数据插入

                //设置不插入列
db.DisableInsertColumns = new string[] { "sex" };//sex列将不会插入值
Student s = new Student()
{
name = "张" + new Random().Next(, int.MaxValue),
sex = "gril"
}; var id = db.Insert(s); //插入 //查询刚插入的sex是否有值
var sex = db.Queryable<Student>().Single(it => it.id == id.ObjToInt()).sex;//无值
var name = db.Queryable<Student>().Single(it => it.id == id.ObjToInt()).name;//有值 //SqlBulkCopy同样支持不挺入列设置
db.SqlBulkCopy(GetInsertList());

更新

                //指定列更新
db.Update<School>(new { name = "蓝翔14" }, it => it.id == ); //只更新name列
db.Update<School, int>(new { name = "蓝翔11 23 12", areaId = }, , , );
db.Update<School, string>(new { name = "蓝翔2" }, new string[] { "", "" });
db.Update<School>(new { name = "蓝翔2" }, it => it.id == );
var array=new int[]{,,};
db.Update<School>(new { name = "蓝翔2" }, it => array.Contains(it.id));// id in 1,2,3 //支持字典更新,适合动态权限
var dic = new Dictionary<string, string>();
dic.Add("name", "第十三条");
dic.Add("areaId", "");
db.Update<School, int>(dic, ); //整个实体更新
db.Update(new School { id = , name = "蓝翔16", AreaId = });
db.Update<School>(new School { id = , name = "蓝翔12", AreaId = }, it => it.id == );
db.Update<School>(new School() { id = , name = "青鸟11" }); //设置不更新列
db.DisableUpdateColumns = new string[] { "CreateTime" };//设置CreateTime不更新 TestUpdateColumns updObj = new TestUpdateColumns()
{
VGUID = Guid.Parse("542b5a27-6984-47c7-a8ee-359e483c8470"),
Name = "xx",
Name2 = "xx2",
IdentityField = ,
CreateTime = null
}; //CreateTime将不会被更新
db.Update(updObj);
//以前实现这种更新需要用指定列的方式实现,现在就简单多了。 //批量更新 数据量小时建议使用
var updateResult = db.UpdateRange(GetUpdateList()); //批量更新 数据量大时建议使用
var updateResult2 = db.SqlBulkReplace(GetUpdateList2());

删除

                //删除根据主键
db.Delete<School, int>(); //删除根据表达示
db.Delete<School>(it => it.id > );//支持it=>array.contains(it.id) //主键批量删除
db.Delete<School, string>(new string[] { "", "", "" }); //非主键批量删除
db.Delete<School, string>(it => it.name, new string[] { "" });
db.Delete<School, int>(it => it.id, new int[] { , }); //根据实体赋值实体一定要有主键,并且要有值。
db.Delete(new School() { id = }); //根据字符串删除
db.Delete<School>("id=@id", new { id = }); //假删除
//db.FalseDelete<school>("is_del", 100);
//等同于 update school set is_del=1 where id in(100)
//db.FalseDelete<school>("is_del", it=>it.id==100);

更多功能

1、枚举支持

  var stuList = db.Queryable<Student>().ToList();
db.Insert<Student>(new Student() { sch_id = SchoolEnum.北大青鸟 });
db.Update<Student>(new Student() { sch_id = SchoolEnum.it清华, id = });
var stuList2 = db.Queryable<Student>().Where(it => it.sch_id == SchoolEnum.全智).ToList();

2、实体生成加T4

使用T4

详细教程:

http://www.cnblogs.com/sunkaixuan/p/5751503.html

3、ADO.NET

                var r1 = db.GetDataTable("select * from student");
var r2 = db.GetSingle<Student>("select * from student LIMIT 0,1");
var r3 = db.GetScalar("select count(1) from student");
var r4 = db.GetReader("select count(1) from student");
r4.Dispose();
var r5 = db.GetString("select name from student LIMIT 0,1");
var r6 = db.ExecuteCommand("select 1"); //参数支持
var p1 = db.GetDataTable("select * from student where id=@id", new {id= });
var p2 = db.GetDataTable("select * from student where id=@id", new Dictionary<string, object>() { { "id", "" } });//目前只支持 Dictionary<string, object>和Dictionary<string, string>
var p3 = db.GetDataTable("select * from student where id=@id", new MySqlParameter("@id",) );

4、日志记录功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar; namespace NewTest.Demos
{
//日志记录功能
public class Log : IDemos
{ public void Init()
{
Console.WriteLine("启动Log.Init");
using (var db = SugarDemoDao.GetInstance())
{ var a1 = db.Queryable<Student>().Where(it => it.id == ).ToList();
var a2 = db.Queryable<Student>().OrderBy(it => it.id).ToList();
}
} public class SugarConfigs
{
public static Action<string, string> LogEventStarting = (sql, pars) =>
{
Console.WriteLine("starting:" + sql + " " + pars); using (var db = SugarDemoDao.GetInstance())
{
//日志记录件事件里面用到数据库操作 IsEnableLogEvent一定要为false否则将引起死循环,并且要新开一个数据实例 像我这样写就没问题。
db.IsEnableLogEvent = false;
db.ExecuteCommand("select 1");
}
};
public static Action<string, string> LogEventCompleted = (sql, pars) =>
{
Console.WriteLine("completed:" + sql + " " + pars);
};
} /// <summary>
/// SqlSugar
/// </summary>
public class SugarDemoDao
{ public static SqlSugarClient GetInstance()
{
var db = new SqlSugarClient(SugarDao.ConnectionString);
db.IsEnableLogEvent = true;//启用日志事件
db.LogEventStarting = SugarConfigs.LogEventStarting;
db.LogEventCompleted = SugarConfigs.LogEventCompleted;
return db;
}
}
}
}

5、别名表功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar;
namespace NewTest.Demos
{
//别名表的功能
public class MappingTable : IDemos
{ public void Init()
{
Console.WriteLine("启动MappingTable.Init"); //单个设置
using (var db = SugarDao.GetInstance())
{
var list = db.Queryable<V_Student>("Student").ToList();//查询的是 select * from student 而我的实体名称为V_Student
} //全局设置
using (var db = SugarFactory.GetInstance())
{
var list = db.Queryable<V_Student>().ToList();//查询的是 select * from student 而我的实体名称为V_Student
}
} /// <summary>
/// 全局配置类
/// </summary>
public class SugarConfigs
{
//key类名 value表名
public static List<KeyValue> MpList = new List<KeyValue>(){
new KeyValue(){ Key="FormAttr", Value="Flow_FormAttr"},
new KeyValue(){ Key="Student3", Value="Student"},
new KeyValue(){ Key="V_Student", Value="Student"}
};
} /// <summary>
/// SqlSugar实例工厂
/// </summary>
public class SugarFactory
{ //禁止实例化
private SugarFactory()
{ }
public static SqlSugarClient GetInstance()
{
string connection = SugarDao.ConnectionString; //这里可以动态根据cookies或session实现多库切换
var db = new SqlSugarClient(connection); db.SetMappingTables(SugarConfigs.MpList);//设置关联表 (引用地址赋值,每次赋值都只是存储一个内存地址) //批量设置别名表
//db.ClassGenerating.ForeachTables(db, tableName =>
//{
// db.AddMappingTable(new KeyValue() { Key = tableName.Replace("bbs.",""), Value = tableName }); //key实体名,value表名
//}); return db;
}
}
}
}

6别名列功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using System.Data.SqlClient;
using MySqlSugar;
namespace NewTest.Demos
{
//别名列的功能
public class MappingColumns : IDemos
{ public void Init()
{
Console.WriteLine("启动MappingColumns.Init"); //全局设置
using (var db = SugarFactory.GetInstance())
{
var list = db.Queryable<Student>().Where(it=>it.classId==).ToList();
}
} public class Student
{ //id
public int classId { get; set; } //name
public string className { get; set; } //sch_id
public int classSchoolId { get; set; } public int isOk { get; set; }
} /// <summary>
/// 全局配置别名列(不区分表)
/// </summary>
public class SugarConfigs
{
//key实体字段名 value表字段名 ,KEY唯一否则异常
public static List<KeyValue> MpList = new List<KeyValue>(){
new KeyValue(){ Key="classId", Value="id"},
new KeyValue(){ Key="className", Value="name"},
new KeyValue(){ Key="classSchoolId", Value="sch_id"}
};
} /// <summary>
/// SqlSugar实例工厂
/// </summary>
public class SugarFactory
{ //禁止实例化
private SugarFactory()
{ }
public static SqlSugarClient GetInstance()
{
string connection = SugarDao.ConnectionString; //这里可以动态根据cookies或session实现多库切换
var db = new SqlSugarClient(connection);
//注意:只有启动属性映射才可以使用SetMappingColumns
db.IsEnableAttributeMapping = true;
db.SetMappingColumns(SugarConfigs.MpList);//设置关联列 (引用地址赋值,每次赋值都只是存储一个内存地址)
return db;
}
}
}
}

7通过属性来设置别名表和别名列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar;
namespace NewTest.Demos
{
//通过属性的方法设置别名表和别名字段(主键和自添列都无需设置 SQLSUGAR会帮你自动处理)
//注意:【属性映射和 (SetMappingTables、SetMappingColumns)方式映射 2种选其中一,不清楚底层缓存机质不建议同时使用】
public class AttributesMapping : IDemos
{ public void Init()
{
Console.WriteLine("启动AttributesMapping.Init");
using (var db = DBManager.GetInstance())
{ //查询
var list = db.Queryable<TestStudent>()
.Where(it => it.className.Contains("小")).OrderBy(it => it.classSchoolId).Select<V_Student>(it => new V_Student() { id = it.classId, name = it.className }).ToList();
var list2 = db.Queryable<TestStudent>()
.JoinTable<TestSchool>((s1, s2) => s1.classSchoolId == s2.classId)
.OrderBy<TestSchool>((s1, s2) => s1.classId)
.Select<TestStudent, TestSchool, V_Student>((s1, s2) => new V_Student() { id = s1.classId, name = s1.className, SchoolName = s2.className }).ToList(); //添加
TestStudent s = new TestStudent();
s.className = "属性名";
s.classSchoolId = ;
var id = db.Insert(s);
s.classId = id.ObjToInt(); db.SqlBulkCopy(new List<TestStudent>() { s }); //更新
db.Update(s);
db.Update<TestStudent, int>(s, );
db.Update<TestStudent>(s, it => it.classId == );
db.SqlBulkReplace(new List<TestStudent>() { s }); //删除
db.Delete<TestStudent>(it => it.classId == ); //根据实体赋值实体一定要有主键,并且要有值。
db.Delete(new TestStudent() { classId = });
}
} /// <summary>
/// 属性只作为初始化映射,SetMappingTables和SetMappingColumns可以覆盖
/// </summary>
[SugarMapping(TableName = "Student")]
public class TestStudent
{ [SugarMapping(ColumnName = "id")]
public int classId { get; set; } [SugarMapping(ColumnName = "name")]
public string className { get; set; } [SugarMapping(ColumnName = "sch_id")]
public int classSchoolId { get; set; } public int isOk { get; set; } /// <summary>
/// 数据库并没有这一列
/// </summary>
public string errorField { get; set; }
} [SugarMapping(TableName = "School")]
public class TestSchool
{ [SugarMapping(ColumnName = "id")]
public int classId { get; set; } [SugarMapping(ColumnName = "name")]
public string className { get; set; } public int AreaId = ;
}
} public class DBManager
{ public static SqlSugarClient GetInstance()
{
var db = new SqlSugarClient(SugarDao.ConnectionString);
db.IsEnableAttributeMapping = true;//启用属性映射
db.IsIgnoreErrorColumns = true;//忽略非数据库列 db.IsEnableLogEvent = true;//启用日志事件
db.LogEventStarting = (sql, par) => { Console.WriteLine(sql + " " + par + "\r\n"); }; return db;
}
}
}

8、行列过滤 (行过滤器可以设置多个,以逗号隔开)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar; namespace NewTest.Demos
{
//行过滤加列过滤
//权限管理的最佳设计
public class Filter2 : IDemos
{ public void Init()
{
Console.WriteLine("启动Filter2.Init");
using (SqlSugarClient db = SugarDaoFilter.GetInstance())//开启数据库连接
{
//设置走哪个过滤器
db.CurrentFilterKey = "role1";
//queryable
var list = db.Queryable<Student>().ToJson(); //where id=1 , 可以查看id和name //设置走哪个过滤器
db.CurrentFilterKey = "role2";
//queryable
var list2 = db.Queryable<Student>().ToJson(); //where id=2 , 可以查看name }
}
/// <summary>
/// 扩展SqlSugarClient
/// </summary>
public class SugarDaoFilter
{
//禁止实例化
private SugarDaoFilter()
{ }
/// <summary>
/// 页面所需要的过滤行
/// </summary>
private static Dictionary<string, Func<KeyValueObj>> _filterRos = new Dictionary<string, Func<KeyValueObj>>()
{
{ "role1",()=>{
return new KeyValueObj(){ Key=" id=@id" , Value=new{ id=}};
}
},
{ "role2",()=>{
return new KeyValueObj() { Key = " id=@id", Value = new { id = } };
}
},
};
/// <summary>
/// 页面所需要的过滤列
/// </summary>
private static Dictionary<string, List<string>> _filterColumns = new Dictionary<string, List<string>>()
{
{ "role1",new List<string>(){"id","name"}
},
{ "role2",new List<string>(){"name"}
},
};
public static SqlSugarClient GetInstance()
{
string connection = SugarDao.ConnectionString; //这里可以动态根据cookies或session实现多库切换
var db = new SqlSugarClient(connection); //支持sqlable和queryable
db.SetFilterFilterParas(_filterRos); //列过滤只支持queryable
db.SetFilterFilterParas(_filterColumns); db.IsEnableLogEvent = true;//启用日志事件
db.LogEventStarting = (sql, par) => { Console.WriteLine(sql + " " + par + "\r\n"); };
return db;
}
}
}
}

9、自动排除非数据库列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar; namespace NewTest.Demos
{
//排除错误列
public class IgnoreErrorColumns : IDemos
{ public void Init()
{
Console.WriteLine("启动IgnoreErrorColumns.Init");
using (var db = SugarDao.GetInstance())
{
db.IsIgnoreErrorColumns = true; //Student表并没有 AreaName
var id= db.Insert<STUDENT>(new STUDENT() { name = "张三", AreaName = "北大" }); db.Update<STUDENT>(new STUDENT() { id=id.ObjToInt() ,name = "张三2", AreaName = "北大" });
}
}
public class STUDENT {
/// <summary>
/// Desc:-
/// Default:-
/// Nullable:False
/// </summary>
public int id { get; set; } /// <summary>
/// Desc:-
/// Default:-
/// Nullable:True
/// </summary>
public string name { get; set; } /// <summary>
/// Desc:学校ID
/// Default:-
/// Nullable:True
/// </summary>
public int? sch_id { get; set; } /// <summary>
/// Desc:-
/// Default:-
/// Nullable:True
/// </summary>
public string sex { get; set; } /// <summary>
/// Desc:-
/// Default:-
/// Nullable:True
/// </summary>
public Boolean? isOk { get; set; } public string SchoolName { get; set; } public string AreaName { get; set; } public string SubjectName { get; set; }
}
}
}

10、事务

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar; namespace NewTest.Demos
{
//事务
public class Tran : IDemos
{ public void Init()
{
Console.WriteLine("启动Tran.Init");
using (SqlSugarClient db = SugarDao.GetInstance())//开启数据库连接
{
db.IsNoLock = true;//启用无锁查询
db.CommandTimeOut = ;//设置超时时间
try
{
db.BeginTran();//开启事务
//db.BeginTran(IsolationLevel.ReadCommitted);+3重载可以设置事世隔离级别 db.CommitTran();//提交事务
}
catch (Exception)
{
db.RollbackTran();//回滚事务
throw;
}
}
}
}
}

11、流水号功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NewTest.Dao;
using Models;
using System.Data.SqlClient;
using MySqlSugar; namespace NewTest.Demos
{
//流水号的功能
public class SerialNumber : IDemos
{ public void Init()
{
Console.WriteLine("启动SerialNumber.Init");
using (SqlSugarClient db = SugarFactory.GetInstance())//开启数据库连接
{
var dientityValue = db.Insert<Student>(new Student() { });
var name = db.Queryable<Student>().Single(it => it.id == dientityValue.ObjToInt()).name;
Console.WriteLine(name); var dientityValue2 = db.Insert<School>(new School() { });
var name2 = db.Queryable<School>().Single(it => it.id == dientityValue2.ObjToInt()).name;
Console.WriteLine(name2); ;
}
} /// <summary>
/// 全局配置类
/// </summary>
public class SugarConfigs
{
public static List<PubModel.SerialNumber> NumList = new List<PubModel.SerialNumber>(){
new PubModel.SerialNumber(){TableName="Student", FieldName="name", GetNumFunc=()=>{ //GetNumFunc在没有事中使用
return "stud-"+DateTime.Now.ToString("yyyy-MM-dd");
}},
new PubModel.SerialNumber(){TableName="School", FieldName="name", GetNumFuncWithDb=db=>{ //事务中请使用GetNumFuncWithDb保证同一个DB对象,不然会出现死锁
return "ch-"+DateTime.Now.ToString("syyyy-MM-dd");
}}
};
} /// <summary>
/// SqlSugar实例工厂
/// </summary>
public class SugarFactory
{ //禁止实例化
private SugarFactory()
{ }
public static SqlSugarClient GetInstance()
{
string connection = SugarDao.ConnectionString; //这里可以动态根据cookies或session实现多库切换
var db = new SqlSugarClient(connection);
db.SetSerialNumber(SugarConfigs.NumList);//设置流水号
return db;
}
}
}
}

12添加VS知能提示,让你立马上手。

http://www.cnblogs.com/sunkaixuan/p/5851425.html

N[开源].NET CORE与MySql更配, MySqlSugar ORM框架 3.x的更多相关文章

  1. 开源一个基于dotnet standard的轻量级的ORM框架-Light.Data

    还在dotnet framework 2.0的时代,当时还没有EF,而NHibernate之类的又太复杂,并且自己也有一些特殊需求,如查询结果直接入表.水平分表和新增数据默认值等,就试着折腾个轻量点O ...

  2. Python操作mysql之SQLAchemy(ORM框架)

    SQLAchemy SQLAchemy 解析: SQLAchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作, 简言之便是:将对象转换成SQ ...

  3. 在.net core web 项目中操作MySql数据库(非ORM框架,原生sql语句方式)

    本案例通过MySql.Data和Dapper包执行原生sql,实现对数据库的操作. 操作步骤: 第1步:在MySql数据库中新建表User(使用Navicat For MySql工具) 建表语句: c ...

  4. python对Mysql操作和使用ORM框架(SQLAlchemy)

    python对mysql的操作 Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 s ...

  5. Visual Studio Code和Docker开发asp.net core和mysql应用

    Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...

  6. NET Core写了一个轻量级的Interception框架[开源]

    NET Core写了一个轻量级的Interception框架[开源] ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只 ...

  7. Entity Framework Core For MySql查询中使用DateTime.Now的问题

    背景 最近一直忙于手上澳洲线上项目的整体迁移和升级的准备工作,导致博客和公众号停更.本周终于艰难的完成了任务,借此机会,总结一下项目中遇到的一些问题. EF Core一直是我们团队中中小型项目常用的O ...

  8. 为什么ElasticSearch比MySQL更适合全文索引

    熟悉 MySQL 的同学一定都知道,MySQL 对于复杂条件查询的支持并不好.MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤,对这个过程不了解的同学可以先行 ...

  9. .NET平台系列12 .NET未来之开源.NET Core

    系列目录     [已更新最新开发文章,点击查看详细] 微软于2014年11月推出了.NET Core 1.0..NET Core的目标是从我们在过去12年中对.NET Framework的构建.交付 ...

随机推荐

  1. .net 下新版highcharts本地导出图片bug处理

    最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...

  2. 升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错(引用他人的)

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  3. iphone使用mac上的SOCKS代理

    Step 1. Make sure the SOCKS tunnel on your work computer allows LAN connections so your iPhone/iPod ...

  4. ABP理论学习之Abp Session

    返回总目录 本篇目录 介绍 注入Session 使用Session属性 介绍 当应用程序要求用户登录时,那么应用程序也需要知道当前用户正在执行的操作.虽然ASP.NET本身在展现层提供了Session ...

  5. 玩转Asp.net MVC 的八个扩展点

    MVC模型以低耦合.可重用.可维护性高等众多优点已逐渐代替了WebForm模型.能够灵活使用MVC提供的扩展点可以达到事半功倍的效果,另一方面Asp.net MVC优秀的设计和高质量的代码也值得我们去 ...

  6. (C#)使用NPOI导出Excel

    在做业务型的软件时,经常需要将某些数据导出,本文介绍了在Winform或Asp.net中使用NPOI(POI 项目的 .NET 版本)来操作Excel文件,而无需安装Office. 首先,需要获取NP ...

  7. 人才市场的IT职位分析

    最近要找长沙的工作,于是通过湖南人才市场搜索了一下职位.结果得到的数据让我很难比较,作为一个 IT 业滚爬了多年的程序员,对这样的搜索结果很不满意.于是,我不得不自己来整理数据了.本文内容包括:网页数 ...

  8. 深入浅出Alljoyn——实例分析之远程调用(Method)篇

    深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...

  9. 说说SQL Server 网络配置

    打开Sql Server Configuration Manager,里面显示了SQL Server的网络配置,这些到底表示什么含义呢? 图一:MSSQLSERVER的协议 这些配置选项,其实就是为了 ...

  10. 三国魂破解1——resmask.swf

    这个是资源文件的映射. 根据index.swf的加载流程,直到初始化会加载: 破解方式: var l:URLLoader = new URLLoader(); l.dataFormat = URLLo ...