Expression 转化为sql(三) --自定义函数

  SQL 语句有很多函数如len(),now()等等。如何来生成这些函数。最近研究也写办法共大家参考。

一.首先建立一个建一个扩展类,控制只能允许这些函数出现,如果出现其他函数就直接报异常。

 1  public static class SQLMethods
 2     {
 3         public static bool DB_In<T>(this T t, List<T> list)  // in
 4         {
 5             return true;
 6         }
 7         public static Boolean DB_NotIn<T>(this T t, List<T> list) // not in
 8         {
 9             return true;
10         }
11         public static int DB_Length(this string t)  // len();
12         {
13             return 0;
14         }
15         public static bool DB_Like(this string t, string str) // like
16         {
17             return true;
18         }
19         public static bool DB_NotLike(this string t, string str) // not like
20         {
21             return true;
22         }
23     }

  我们要生成sql,那么函数的返回值没有意思,len() ,like,和not 只能针对字符串类型, in 和not in 可以针对所有类型。

  二.处理不同函数相关的逻辑。

     1.判断函数所在类的命名空间是否我是我们要求的。

    2.根据函数名处理。出现意外函数抛出异常

    代码如下"

 1  private string DealMethodsCall(MethodCallExpression m_exp)
 2         {
 3             var k = m_exp;
 4             var g = k.Arguments[0];
 5             /// 控制函数所在类名。
 6             if (k.Method.DeclaringType != typeof(SQLMethods))
 7             {
 8                 throw new Exception("无法识别函数");
 9             }
10             switch (k.Method.Name)
11             {
12                 case "DB_Length":
13                     {
14                         var exp  = k.Arguments[0];
15                         return "LEN(" + DealExpression(exp) + ")";
16                     }
17                 case "DB_In":
18                 case "DB_NotIn":
19                     {
20                         var exp1 = k.Arguments[0];
21                         var exp2 = k.Arguments[1];
22                         string methods = string.Empty;
23                         if (k.Method.Name == "In")
24                         {
25                             methods = " IN ";
26                         }
27                         else
28                         {
29                             methods = " NOT IN ";
30                         }
31                         return DealExpression(exp1) + methods + DealExpression(exp2);
32                     }
33                 case "DB_Like":
34                 case "DB_NotLike":
35                     {
36                         var exp1 = k.Arguments[0];
37                         var exp2 = k.Arguments[1];
38                         string methods = string.Empty;
39                         if (k.Method.Name == "DB_Like")
40                         {
41                             methods = " LIKE ";
42                         }
43                         else
44                         {
45                             methods = " NOT LIKE ";
46                         }
47                         return  DealExpression(exp1) + methods + DealExpression(exp2);
48
49                     }
50             }
51             ///   未知的函数
52             throw new Exception("意外的函数");
53         }

处理相关函数

三. 调试结果

  

  最近把ExpressionToSQL 类已整理出来,供大家下载参考。

ExpressionToSQL.zip 下载

时间: 2024-10-12 15:45:55

Expression 转化为sql(三) --自定义函数的相关文章

SQL Server -- 自定义函数(学习总结,备忘)

SQL Server自定义函数,以前只在书上看过,没有动手去敲一敲,今天刚好接触到,看了几篇博文学习了下.做好备忘很重要!! (@[email protected])Y Learn from:http://www.cnblogs.com/lideng/archive/2013/04/15/3022418.html 自定义函数分为:标量值函数或表值函数两种. 标量值函数:如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数. 表值函数:如果 RETURNS 子句指定 TABLE,则函

SQL Server 自定义函数(Function)——参数默认值

原文:SQL Server 自定义函数(Function)--参数默认值 sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,

13、SQL Server 自定义函数

SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值函数用于返回单个值,而表值函数用于返回一个结果集. 函数参数 参数可以是常量.表中的某个列.表达式或其他类型的值.在函数中有三种类型的参数. 1.输入:指必须输入一个值. 2.可选值:在执行该参数时,可以选择不输入参数. 3.默认值:函数中默认有值存在,调用时可以不指定该值. 创建标量值函数 语法:

也来谈谈SQL SERVER 自定义函数~

在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表值函数,顾名思义函数的返回值当然是返回一个表了.就是 TABLE 类型.TABLE 类型就相当于一张存储在内存中的一张虚拟表. 表值函数有分为内联表值函数(相当于参数化的视图)和多语句表值函数,二者原理一样,功能略有不同当然写法也就略有不同. 多语句表值函数 语法模板: CREATE FUNCTIO

Microsoft SQL Server 自定义函数整理大全

01.去除字符串中的html标记及标记中的内容 [叶子函数分享一]去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varchar(8000) as begin     declare @i int     while 1 = 1     begin        set @i=len(@maco)        set @maco=replace(@maco

Microsoft SQL Server 自定义函数整理大全(下)

34.字符串转成16进制函数 /**************************** 字符串转成16进制 作者:不得闲 QQ: 75492895 Email: [email protected] ****************************/ --创建函数(suiyunonghen(不得闲)) Create Function VarCharToHex(@Str Varchar(400)) returns varchar(800) as begin declare @i int,@

SQL常用自定义函数

去除字符串中连续的分割符 --创建函数 create function [dbo].[m_delrepeatsplit] ( @str varchar(2000), @split nvarchar(200) ) returns nvarchar(2000) as begin --begin declare declare @count int,@i int,@isnull int declare @newchar nvarchar(200),@nn nvarchar(300) set @coun

Sql建立自定义函数(函数和调用实例)(转载)

[sql] ------------------ 建立函数 create function dbo.Csj (@m_str varchar(80)) returns varchar(80) as begin declare @i varchar(80) if @m_str='0' set @i='A' if @m_str='1' set @i='B' return (@i) end -- 调用,不要和建立函数一起使用,会出错.先建立,再调用. declare @SmsContent varcha

SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面就是函数: 1 Create Function IntToHexLength(@Num int,@HxLength int) 2 returns varchar(16) 3 as 4 begin 5 declare @Mods int,@res varchar(16),@Length int 6 s