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 ;
  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[];
  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[];
  15. return "LEN(" + DealExpression(exp) + ")";
  16. }
  17. case "DB_In":
  18. case "DB_NotIn":
  19. {
  20. var exp1 = k.Arguments[];
  21. var exp2 = k.Arguments[];
  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[];
  37. var exp2 = k.Arguments[];
  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 下载

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

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

    sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Functio ...

  2. sql server 自定义函数的使用

    sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...

  3. 13、SQL Server 自定义函数

    SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值 ...

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

    在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...

  5. SQL强化(三) 自定义函数

    ---恢复内容开始--- Oracle中我们可以通过自定义函数去做一些逻辑判断,这样可以减少查询语句,提高开发效率 create  -- 创建自定义函数 or replace -- 有同名函数就替换, ...

  6. SQL Server自定义函数( 转载于51CTO )

    用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...

  7. sql server自定义函数学习笔记

    sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...

  8. SQL Function 自定义函数

    目录 产生背景(已经有了存储过程,为什么还要使用自定义函数) 发展历史 构成 使用方法 适用范围 注意事项 疑问   内容 产生背景(已经有了存储过程,为什么还要使用自定义函数) 与存储过程的区别(存 ...

  9. SQL server 自定义函数FUNCTION的使用

    原文链接:https://blog.csdn.net/lanxingbudui/article/details/81736402 前言:        在SQL server中不仅可以可以使用系统自带 ...

随机推荐

  1. UPS对电源故障的处理能力

    UPS对电源故障的处理能力 双变换在线式UPS由于其逆变器实时在线工作,因而能对所有的电源故障具有隔离和处理功能.由于目前电网情况发生了很大变化,真正的长时间断电只占所有电源故障的30%甚至更低,而非 ...

  2. Java设计模式之(建造者模式)

    建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:抽象建造者,给出一个抽象接口,以规范产品对象的各个组 ...

  3. 1. Skippr

    Skippr 是一个超级简单的 jQuery 幻灯片插件.只是包括你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了.Skippr 能够自适应窗口 ...

  4. ajax从新浪获取实时股票数据

    最近在给公司做一个报表展示,然后领导要求上面加上一些股票的实时数据展示. 一开始同事给我一个聚合数据的网址,说从这上面可以获取到.我一看,哟呵,API接口什么的都提供好了,确实方便.然后想用的时候才发 ...

  5. Lambda表达式和Lambda表达式树

    LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambd ...

  6. 图零直播新闻发布会—TOLINK2.0全面上线

    在网络直播时代和现代信息技术条件下,教务管理正在由传统管理方式向数字化管理模式转变.教务管理创新需要现代信息技术来实现,使得教务管理的质量和效率得到了质的飞跃.图零直播,中国IT在线直播教育引领者,在 ...

  7. 【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

    A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/arc ...

  8. grunt轻松入门

    项目目录,js源文件 gruntest Gruntfile.js package.json -- js ext community_plugin.js glogin_frm_cover.js iLog ...

  9. 结构体的vector resize()与初始化

    序: 我们在使用vector的时候可以自定义里面的数据类型.例如这样: struct Edge{ int from; int to; int weight; }; vector<Edge> ...

  10. php 中时间函数date及常用的时间计算

    曾在项目中需要使用到今天,昨天,本周,本月,本季度,今年,上周上月,上季度等等时间戳,趁最近时间比较充足,因此计划对php的相关时间知识点进行总结学习 1,阅读php手册date函数 常用时间函数: ...