net下的半自动orm+linq的《SqlBatis》
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了net下的半自动orm+linq的《SqlBatis》,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3625字,纯文字阅读大概需要6分钟。
内容图文
![net下的半自动orm+linq的《SqlBatis》](/upload/InfoBanner/zyjiaocheng/878/8695977882154237b681924d65d37941.jpg)
一、项目介绍
该项目内置单表linq操作,xml动态sql解析,词法分析,类型映射等功能。
-
SqlMapper,用来处理sql与数据库操作,它设计的目标是支持mysql,sqlserver,sqllite,pgsql等.
-
TypeMapper用于完成将数据库的字段类型映射到C#类型,内部定义了类型转换函数和转换规则.
-
TypeConvert用于完成数据库记录到C#类型的转换。通过IL动态创建IDataReader对象到C#实体类的转换函数和将C#对象解构成Key-value的函数.
-
ExpressionContext是一个轻量的词法分析器,用于将字符串表达式生成C#表达式,进而生成委托.
- XmlResovle用于解析xml配置,如果你的项目仅需要xml动态解析功能你完全可以下载我的源码进行改进(它在github中开源)
- https://github.com/1448376744/SqlBatis
二 、词法分析器
该类型的实例是线程安全的,可复用的。它的设计及其简单,功能也很有限,但是对于我们的需求足够了. 它的实现逻辑如下:
var expr = "(Age!=null) && (Name=='zs')"; /** 1.通过正则匹配出每一个括号,因此你必须手动的给每个二元表达式加括号,它无法识别运算符的优先级. $1 = (Age!=null) $2 = (Name=='zs') $3 = $1 && $2 2.创建参数类型 Expression.Parameter(typeof(T), "p"); 3.逐个创建二元表达式 Expression.MakeUnary(ExpressionType.Convert, expr, type) ... */ var context = new ExpressionContext(); //Age必须是可以为null的类型:int? var result = context.Create<Student>("(Age != null) && (Name=='zs')"); var flag= result.Func(new Student { Age = 1, Name = "zs" }); /** 常见错误: 1. (Age != null) && Name=='zs' 2. public class Student{ public int Age{get;set;} public string Name {get;set;}} */
三、XML解析
<?xml version="1.0" encoding="utf-8" ?> <commands namespace="sutdent"> <!-- 框架只定义了if,variable,where等标签 insert,select可以随意,并没有实际意义 --> <variable id="columns"> Id,Age,Name </variable> <select id="list-dynamic"> select ${columns} from student <where> <if test="id=@Id"/> </where> limit 0,1 </select> <insert id="add"> insert into student(name,age)values(@Name,@age) </insert> </commands>
//for xml query var resovle = new XmlResovle(); resovle.Load(@"E:\SqlBatis\SqlBatis.Test", "*.xml"); //普通sql var sql1 = resovle.Resolve("namespace.id"); //动态sql var sql2 = resovle.Resolve("namespace.id",new { Id=(int?)null,Age=2});
四、配置DbContext
方式1
public class MysqlDbConrext : DbContext { public readonly IDbQuery<Student> Students; private static readonly IXmlResovle resovle; static MysqlDbConrext() {
//不要为每一个DbContext加载配置 resovle = new XmlResovle(); resovle.Load(@"E:\SqlBatis\SqlBatis.Test","*.xml"); } protected override void OnLogging(string message, object parameter = null, int? commandTimeout = null, CommandType? commandType = null) { } protected override DbContextBuilder OnConfiguring(DbContextBuilder builder) { ILoggerFactory factory = LoggerFactory.Create(b => { b.AddConsole(); b.AddDebug(); b.SetMinimumLevel(LogLevel.Debug); }); builder.Connection = new MySql.Data.MySqlClient.MySqlConnection("server=127.0.0.1;user id=root;password=1024;database=test;"); builder.XmlResovle = null; return builder; } public MysqlDbConrext() { Students = new DbQuery<Student>(this); } }
方式2
var db = new DbContext(new DbContextBuilder() { DbContextType=DbContextType.Mysql, ... });
五、XML+Linq
using (var db = new SqlDbContext()) { //linq var row =db.Students.Delete(); var (list, count) = db.Students .Page(1,2) .SelectMany(); //dynamic var p = new { Id = (int?)null, Name = "zs" }; var dylist = db.Students .Where(a=>a.Id==1,p.Id!=null) .Where(a => a.Name == p.Name, p.Name != null) .SelectMany(); //xml row = db.From("sutdent.add",new Student() { Age=20, IsDelete=true, Name="xml" }).ExecuteNonQuery(); //dynamic row = db.From("list-dynamic", p).ExecuteNonQuery(); using(var muti = db.ExecuteMutiQuery("select * from student;select count(1) from student;")) { //第一个结果集 var list = muti.GetList<Student>(); //第二个结果集 var count = muti.Get<int>(); } }
内容总结
以上是互联网集市为您收集整理的net下的半自动orm+linq的《SqlBatis》全部内容,希望文章能够帮你解决net下的半自动orm+linq的《SqlBatis》所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。