java 拉姆表达式_强大的拉姆表达式转Sql 类库 - SqlSugar 隐藏功能之Lambda
使用场景
1、Lambda to sql 一直是ORM中最难的功能之一,如果有现成的解析库那么自已写一个ORM难度将大大降低
2、通过Lambda作为KEY进行缓存操作,特别是仓储模式想要拿到表达式进行通用查询缓存 则需要用到表达式解析
3、学习爱好者,如果能够较深入的理Lambda如何去解成Sql,那么你对Lambda的理解将会更上一个层次,而不仅仅在使用上
优点
SqlSugar除了有自带的ORM功能,还是一款强大的拉姆达解析器 ,并且是市场上独有 的拉姆达转Sql类库
SqlSugar不仅小巧并且性能非常的好,毫不逊色于Dapper 甚至更加的优秀 ,至于性能别看其他人的测评 非常不靠谱,自个用了才知道,自个测了才知道
1、高性能 表达式解析速度远超EF
2、功能非常完整 ,并且是产品级的解析类库,支持各种模式的解析
3、小巧你只要引用SqlSugar一个DLL就能使用 解析各种数据库 、支持Sql函数 、支持常用原生函数
安装
.NET CORE / NET5 Nuget SqlSugarCore
.NET 4.5 Nuget SqlSugar
.NET 4.0 Nuget SqlSuagr 4.x
入门
我们先来看一下例子:
static void Main(string[] args)
{var age = 11;
Expression> exp = a => a.id == age; //表达式
SqlServerExpressionContext expContext = new SqlServerExpressionContext();//创建解析对象
expContext.Resolve(exp, ResolveExpressType.WhereSingle);//开始解析
var value = expContext.Result.GetString();//( [id] = @id0 )
var pars = expContext.Parameters;//@id:11
}
下面是调试结果:
通过上面的例子就能够完美的将表达式转换成Sql语句
教程案例
1、如何创建 ExpressionContext 解析对象
我们可以通过SqlSugar.DbType进行区分数据库 并且进行实例化
ExpressionContext expContext=null;switch(dbtype)
{caseDbType.MySql:
expContext= newMySqlExpressionContext();break;caseDbType.SqlServer:
expContext= newSqlServerExpressionContext();break;caseDbType.Sqlite:
expContext= newSqliteExpressionContext();break;caseDbType.Oracle:
expContext= newOracleExpressionContext();break;caseDbType.PostgreSQL:
expContext= newPostgreSQLExpressionContext();break;caseDbType.Dm:
expContext= newDmExpressionContext();break;caseDbType.Kdbndp:
expContext= newKdbndpExpressionContext();break;default:throw new Exception("不支持");
2、Where条件的解析
基本和写EF一样常用的都会支持
Expression> exp = it => it.Bool2==b.Value;
expContext.Resolve(exp, ResolveExpressType.WhereSingle);var value =expContext.Result.GetString();var pars =expContext.Parameters;//( [Bool2] = @Bool20 )
我们在写一个Like的例子
Expression> exp = it =>it.Name.Contains(schoolData.Name);
ExpressionContext expContext= newExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereMultiple);var value =expContext.Result.GetString();var pars =expContext.Parameters;//([it].[Name] like '%'+@MethodConst0+'%')
bool类型的解析是ORM解析的难点中的难点,情况多种多样
Expression> exp = it => it.Bool1&&it.Bool1;
SqlServerExpressionContext expContext= newSqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);var value =expContext.Result.GetString();var pars =expContext.Parameters;//( ( [Bool1]=1 ) AND ( [Bool1]=1 ) )
多样化的bool解释的支持
Expression> exp = it =>true&& it.Name != null;
ExpressionContext expContext= newExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);var value =expContext.Result.GetString();var pars =expContext.Parameters;//(( 1 = 1 ) AND( [Name] IS NOT NULL ))
多表查询的支持,在多表查询中我们是需要加前缀的比如 我们想要 it.id 而不是id
Expression> exp = it => (it.Id > 1 && it.Name != name || it.Id == 1) || it.Name ==WhereConst.name;
ExpressionContext expContext= newExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereMultiple);var value =expContext.Result.GetString();var pars =expContext.Parameters;//(((( [it].[Id] > @Id0 ) AND ( [it].[Name] <> @Name1 )) OR ( [it].[Id] = @Id2 )) OR ( [it].[Name] = @Name3 ))
3、如何解析Select
支持实体类解析、查询单个字段解析、匿名对象解析
Expression> exp =it => new DataTestInfo2() { Bool1=it.Bool1 , Bool2=it.Bool2 };
ExpressionContext expContext= newExpressionContext();
expContext.IsSingle= false;
expContext.Resolve(exp, ResolveExpressType.SelectSingle);var selectorValue =expContext.Result.GetString();var pars =expContext.Parameters;//[Bool1] AS [Bool1] , [Bool2] AS [Bool2]
Expression> exp = (it, school) => new { Name = "a", Id = it.Id / 2, SchoolId =school.Id };
ExpressionContext expContext= newExpressionContext();
expContext.IsSingle= false;
expContext.Resolve(exp, ResolveExpressType.SelectMultiple);var selectorValue =expContext.Result.GetString();//@constant0 AS [Name] , ( [it].[Id] / @Id1 ) AS [Id] , [school].[Id] AS [SchoolId]
3、字段名称的解析
例如orderby(it=>it.Name) 像这种我们就需要拿到Name
Expression> exp = it =>it.Name;
ExpressionContext expContext=GetContext();
expContext.Resolve(exp, ResolveExpressType.FieldSingle);var selectorValue =expContext.Result.GetString();//Name
统计单 个字段
Expression> exp = it =>SqlFunc.AggregateAvg(it.Id);
ExpressionContext expContext=GetContext();
expContext.Resolve(exp, ResolveExpressType.FieldMultiple);var selectorValue =expContext.Result.GetString();//AVG([it].[Id])
4、Sql函数的支持
Expression> exp = it => (it.Name.Contains("a")? 1:2)==1;
SqlServerExpressionContext expContext= newSqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);var value =expContext.Result.GetString();var pars =expContext.Parameters;//(( CASE WHEN ([Name] like '%'+@MethodConst0+'%') THEN @MethodConst1 ELSE @MethodConst2 END ) = @Const3 )
支持的C#函数:
.ToString .Contains .Length
.ToLower .ToUpper .ToSubstring
.Equals .HasValue .Replace
.EndsWith .StartsWith .Trim
.HasValue .Value .AddDay .Date
和常用的Convert.ToInt32等等
SqlFunc.函数
SqlFunc函数下面包含了大量SQL函数
SqlFunc.IF(st.Id > 1)
.Return(st.Id)
.ElseIF(st.Id== 1)
.Return(st.SchoolId).End(st.Id) //等于Case when
5、其它功能
5.1 支持特性比如我表名和实体名不一样我们也可以实现
SqlServerExpressionContext expContext = newSqlServerExpressionContext();
expContext.MappingTables.Add(typeof(Student).Name,"OA_STUDENT")
列名也非常容易
SqlServerExpressionContext expContext = newSqlServerExpressionContext();
expContext.MappingColumns.Add("Id","ID",typeof(Student).Name)
5.2 支持子查询
Expression> exp = a => SqlFunc.Subqueryable().Where(it => it.testId == a.id).Select(it => it.id) == 1);var expContext = newSqlServerExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereSingle);var value =expContext.Result.GetString();var pars = expContext.Parameters;
6、自已动手创建ORM
通上面的学习你们想写出下面的语法应该相当容易了
var oneClass = db.Queryable((o, i, c) => o.Id == i.OrderId&& o.CustomId ==c.Id))
.Where(o=>o.id==1)
.Where((o,i)=>i.xx==1)
.OrderBy(o=>o.Id)
.Select((o,i,c)=> newViewOrder
{
Id=SqlFunc.GetSelfAndAutoFill(o.Id),//o.*
CustomName=c.Name //[c].[Name] AS [CustomName]
}).ToList()
实现上面的功能 总共用到Where的解析、列的解析和Select的解析
1、下面3个用到Where的解析
(o, i, c) => o.Id == i.OrderId&& o.CustomId ==c.Id)
o=>o.id==1(o,i)=>i.xx==1
2、下面1个用到列的解析
o=>o.Id
3、下面1个用到Select的解析
(o,i,c)=> newViewOrder
{
Id=SqlFunc.GetSelfAndAutoFill(o.Id),//o.*
CustomName=c.Name //[c].[Name] AS [CustomName]
}
源码下载:
你们的赞或者你们的 star 就是 开源者的动力 ,开源不容易和气生财
彩蛋:
下一篇文章 我会介绍如何使用 SqlSugar 实现WebFirst模式开发代码,领先CodeFirst和DbFirst的设计和开发理念,也我十多年开发经验的汇总
java 拉姆表达式_强大的拉姆表达式转Sql 类库 - SqlSugar 隐藏功能之Lambda相关推荐
- java 匿名委托_委托,匿名方法,λ 表达式
1.委托:委托本质上就是函数指针,但由于指针过于灵活,因此在很多语言中都采用了更加安全的替代类型,比如Delphi的对象方法和C#的委托.委托使得方法可以做为参数进行传递,极大的方便了程序的处理(事件 ...
- 前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗
什么是波兰表达式 我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间.这种表达式人类很容易识别,并根据其进行计算,但计算机识别这种表达式非常困难. a + b * (c ...
- java 简单 语言_将简单的表达式语言放入java中
使用 JavaScript engine that is bundled with Java 1.6怎么样? 您可以看到如何传递所有参数: ScriptEngineManager manager = ...
- java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)
数据结构之后缀表达式求值(java实现) 前记 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...
- 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版
南故笙烟:中缀表达式转为后缀表达式zhuanlan.zhihu.com 思路分析 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将其压入s2 4 ...
- 将整数k转换成实数python表达式_在混合类型表达式中python自动转换intlongfloat例如.ppt...
在混合类型表达式中python自动转换intlongfloat例如 空位:格式指示符,描述了填入的值的输出形式. %. 类型字符: 宽度:用多少位置显示数值. 省略或指定为0:根据值的实际长度显示. ...
- 2的31次方-1的python表达式_[python]运算符与表达式
1. 数字操作 所有数字类型可进行以下操作: 操作 描述 x + y 加法 x - y 减法 x * y 乘法 x / y 除法 x // y 截断除法 x ** y 乘方(x的y次方) x % y ...
- vue 设置输入法隐藏_原来iPhone自带的输入法这么强大?好多人都不知道其中的隐藏功能...
输入法,我们每天肯定都要用到.无论是和别人打字聊天还是在网上搜索知识,都是需要用到输入法的.那你觉得苹果手机上自带的输入法好用吗?小编问过身边许多的朋友,他们都觉得不好用.其实iPhone自带的输入法 ...
- 苹果切换输入法_原来iPhone自带的输入法这么强大?好多人都不知道其中的隐藏功能...
输入法,我们每天肯定都要用到.无论是和别人打字聊天还是在网上搜索知识,都是需要用到输入法的.那你觉得苹果手机上自带的输入法好用吗?小编问过身边许多的朋友,他们都觉得不好用.其实iPhone自带的输入法 ...
最新文章
- virtualbox不能识别u盘等移动设备
- Spring扫描类过程解析和案例
- 【翻译】asp.net core中使用MediatR
- c语言lr分析器的设计与实现_[源码和文档分享]基于有限自动机的词法分析器构造...
- Python——列表生成式变形
- 《你必须知道的.NET》--简易不简单:认识枚举(Ⅲ)
- 解决了跨域POST的问题
- IIS7.5 安装设置-Sql Sever2008安装设置-移动端设置等必读
- ftp协议是一种用于什么的协议_购房协议怎么写?签购房协议要注意什么
- Spring AOP报错Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available问题
- (231)Verilog HDL:减法器
- Android 判断摄像头权限方法
- 眼镜计算机检查,配眼镜时电脑验光到底准不准?
- 网红萌宠“JUJU奇幻乐园”闪临龙德广场 五月活动玩转不停
- [MRP]到底MRP、MRPⅡ、ERP之间是什么关系?
- VS2019创建和使用静态库(.lib文件)
- 数据库两时间类型相减_sql中两个时间类型相减得到的值
- Android修行手册 - 自定义验证码输入框
- C++11 std::snprintf
- 如何去除有道云笔记广告