简易orm 主要是为了旧平台查询方便
直接新建个文件即可
ExLogic.cs
public class ExLogic
{ public static int Execute(string sqlCommand, string dbConnection = "WebDb")
{
Database db = DatabaseFactory.CreateDatabase(dbConnection);
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
try
{
return Convert.ToInt32(db.ExecuteScalar(dbCommand));
}
catch (Exception ex)
{
Logging.WriteLog(ex);
throw ex;
} } /// <summary>
/// 获取对象
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="where">非必填</param>
/// <returns></returns>
public static T Get<T>(Expression<Func<T, bool>> where = null, string dbConnection = "WebDb") where T : class, new()
{
var whereSql = LambdaToSqlHelper.GetWhereSql(where); Database db = DatabaseFactory.CreateDatabase(dbConnection);
string sqlCommand = $"SELECT * FROM {typeof(T).Name} WHERE " + (where == null ? "1==1" : whereSql);
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
try
{
var res = new T();
using (IDataReader dr = db.ExecuteReader(dbCommand))
{
if (dr.Read())
{
var typeoft = typeof(T);
var proper = typeoft.GetProperties();
foreach (var item in proper)
{
if (item.PropertyType == typeof(int))
item.SetValue(res, DataReaderHelper.GetInt32(dr, item.Name), null);
else if (item.PropertyType == typeof(long))
item.SetValue(res, DataReaderHelper.GetInt64(dr, item.Name), null);
else if (item.PropertyType == typeof(string))
item.SetValue(res, DataReaderHelper.GetString(dr, item.Name), null);
else if (item.PropertyType == typeof(bool))
item.SetValue(res, DataReaderHelper.GetBoolean(dr, item.Name), null);
else if (item.PropertyType == typeof(decimal))
item.SetValue(res, DataReaderHelper.GetDecimal(dr, item.Name), null);
else if (item.PropertyType == typeof(double))
item.SetValue(res, DataReaderHelper.GetDouble(dr, item.Name), null);
else if (item.PropertyType == typeof(DateTime))
item.SetValue(res, DataReaderHelper.GetDateTime(dr, item.Name), null);
}
}
}
return res;
}
catch (Exception ex)
{
throw;
}
} } /// <summary>
/// 这部分代码网上可找,自行百度 ,我有稍作修改
/// </summary>
public static class LambdaToSqlHelper
{ #region 基础方法 #region 获取条件语句方法 public static string GetWhereSql<T>(Expression<Func<T, bool>> func) where T : class
{
string res;
if (func.Body is BinaryExpression)
{
//起始参数 BinaryExpression be = ((BinaryExpression)func.Body);
res = BinarExpressionProvider(be.Left, be.Right, be.NodeType);
}
else if (func.Body is MethodCallExpression)
{
MethodCallExpression be = ((MethodCallExpression)func.Body);
res = ExpressionRouter(func.Body);
}
else
{
res = " ";
} return res;
} #endregion 获取条件语句方法 #region 获取排序语句 order by public static string GetOrderSql<T>(Expression<Func<T, object>> exp) where T : class
{
var res = "";
if (exp.Body is UnaryExpression)
{
UnaryExpression ue = ((UnaryExpression)exp.Body);
res = "order by `" + ExpressionRouter(ue.Operand).ToLower() + "`";
}
else
{
MemberExpression order = ((MemberExpression)exp.Body);
res = "order by `" + order.Member.Name.ToLower() + "`";
}
return res;
} #endregion 获取排序语句 order by #endregion 基础方法 #region 底层 public static bool In<T>(this T obj, T[] array)
{
return true;
} public static bool NotIn<T>(this T obj, T[] array)
{
return true;
} public static bool Like(this string str, string likeStr)
{
return true;
} public static bool NotLike(this string str, string likeStr)
{
return true;
} private static string GetValueStringByType(object oj)
{
if (oj == null)
{
return "null";
}
else if (oj is ValueType)
{
return oj.ToString();
}
else if (oj is string || oj is DateTime || oj is char)
{
return string.Format("'{0}'", oj.ToString());
}
else
{
return string.Format("'{0}'", oj.ToString());
}
} private static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type)
{
var sb = string.Empty;
//先处理左边
string reLeftStr = ExpressionRouter(left);
sb += reLeftStr; sb += ExpressionTypeCast(type); //再处理右边
string tmpStr = ExpressionRouter(right);
if (tmpStr == "null")
{
if (sb.EndsWith(" ="))
{
sb = sb.Substring(0, sb.Length - 2) + " is null";
}
else if (sb.EndsWith("<>"))
{
sb = sb.Substring(0, sb.Length - 2) + " is not null";
}
}
else
{
//添加参数
sb += tmpStr;
} return sb;
} private static string ExpressionRouter(Expression exp)
{
string sb = string.Empty; if (exp is BinaryExpression)
{
BinaryExpression be = ((BinaryExpression)exp);
return BinarExpressionProvider(be.Left, be.Right, be.NodeType);
}
else if (exp is MemberExpression)
{
MemberExpression me = ((MemberExpression)exp);
if (!exp.ToString().StartsWith("value"))
{
return me.Member.Name;
}
else
{
var result = Expression.Lambda(exp).Compile().DynamicInvoke();
if (result == null)
{
return "null";
}
else
{
return result.ToString();
}
}
}
else if (exp is NewArrayExpression)
{
NewArrayExpression ae = ((NewArrayExpression)exp);
StringBuilder tmpstr = new StringBuilder();
foreach (Expression ex in ae.Expressions)
{
tmpstr.Append(ExpressionRouter(ex));
tmpstr.Append(",");
}
//添加参数 return tmpstr.ToString(0, tmpstr.Length - 1);
}
else if (exp is MethodCallExpression)
{
MethodCallExpression mce = (MethodCallExpression)exp;
string par = ExpressionRouter(mce.Arguments[0]);
if (mce.Method.Name == "Like")
{
//添加参数用
return string.Format("({0} like {1})", par, ExpressionRouter(mce.Arguments[1]));
}
else if (mce.Method.Name == "NotLike")
{
//添加参数用
return string.Format("({0} Not like {1})", par, ExpressionRouter(mce.Arguments[1]));
}
else if (mce.Method.Name == "In")
{
//添加参数用
return string.Format("{0} In ({1})", par, ExpressionRouter(mce.Arguments[1]));
}
else if (mce.Method.Name == "NotIn")
{
//添加参数用
return string.Format("{0} Not In ({1})", par, ExpressionRouter(mce.Arguments[1]));
}
}
else if (exp is ConstantExpression)
{
ConstantExpression ce = ((ConstantExpression)exp);
if (ce.Value == null)
{
return "null";
}
else
{ return $"'{ce.Value.ToString()}'"; } //对数值进行参数附加
}
else if (exp is UnaryExpression)
{
UnaryExpression ue = ((UnaryExpression)exp); return ExpressionRouter(ue.Operand);
}
return null;
} private static string ExpressionTypeCast(ExpressionType type)
{
switch (type)
{
case ExpressionType.And:
case ExpressionType.AndAlso:
return " AND "; case ExpressionType.Equal:
return " ="; case ExpressionType.GreaterThan:
return " >"; case ExpressionType.GreaterThanOrEqual:
return ">="; case ExpressionType.LessThan:
return "<"; case ExpressionType.LessThanOrEqual:
return "<="; case ExpressionType.NotEqual:
return "<>"; case ExpressionType.Or:
case ExpressionType.OrElse:
return " Or "; case ExpressionType.Add:
case ExpressionType.AddChecked:
return "+"; case ExpressionType.Subtract:
case ExpressionType.SubtractChecked:
return "-"; case ExpressionType.Divide:
return "/"; case ExpressionType.Multiply:
case ExpressionType.MultiplyChecked:
return "*"; default:
return null;
}
} #endregion 底层
}
使用
var entity=ExLogic.Get<DeviceNbIotMapping>(s => s.id == id);//返回单个
//需要返回列表等功能自行扩展
简易orm 主要是为了旧平台查询方便的更多相关文章
- 十四、EnterpriseFrameWork框架核心类库之简易ORM
在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,D ...
- 基于Torndb的简易ORM
============================================================================ 原创作品,同意转载. 转载时请务必以超链接形式 ...
- Django中ORM模型总结(一)[概述,查询语句]
理解ORM框架 概述 O:(objects)->类和对象. R:(Relation)->关系,关系数据库中的表格. M:(Mapping)->映射. 作用: 可以通过类和类对象就可以 ...
- [Django] 查看orm自己主动运行的原始查询sql
django的文档看了非常多.也用了不少,有的时候感觉性能非常不好,知道非常多地方是惰性查询.可是对于复杂的逻辑.仅仅是表面上发现执行非常慢,机器资源消耗非常多.却不知道orm究竟是什么来转化成sql ...
- orm 通用方法——QueryModelById 主键查询
方法定义: /** * 描述:根据主键查询 * 作者:Tianqi * 日期:2014-09-15 * param:model 对象实例,包含主键 * return:对象 * */ func Quer ...
- Django ORM Queryset 的缓存机制, 惰性查询简述
在Django的ORM中 必须注意由于QuerySet的 cache导致的数据获取不正确的问题 在哪些情况下不会出发QuerySet缓存? 隐式存储QuerySet(查询语句没有显示赋值给变量而直接进 ...
- Bitter.Core系列五:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 分页聚联查询
Bitter.Core 在聚联/分页聚联查询的时候,采用原生的MSSQL, MYSQL 语句查询,做过复杂高级项目的人知道,原生的聚合查询代码执行效率更高,更快,更容易书写,开发量最少. 借助原生的M ...
- 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台
作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- 基于PDO的简易ORM
#基于PRO的一个简单地ORM GitHub 项目地址 #在用原生写脚本的时候怀念起框架中封装好的ORM,所以仿照laravel写了这个简洁版的ORM,可以链式操作. #实现功能 ###条件函数 ta ...
随机推荐
- bootstrap table表格按钮
1 <body> 2 3 <form action="" method="POST" class="form-horizontal& ...
- 【服务器数据恢复】VMware虚拟机数据恢复案例
服务器数据恢复环境:一台某品牌PowerEdge系列服务器和一台PowerVault系列存储,上层是ESXI虚拟机文件,虚拟机中运行SQL Server数据库. 服务器故障:机房非正常断电导致虚拟机无 ...
- vue3文档学习
1.vue的核心功能 1.声明式渲染2.响应性: vue会自动跟踪JavaScript状态并在其发生变化时响应式的更新DOM. 2.渐进式框架 根据不同的需求场景,可以用不同的方式使用vue: 1.无 ...
- QE11 / QE51N 界面太小问题
修复后界面是,修复前常规页签中的数据只能显示4行,需要的note是 2639352 , SNOTE 进行打补丁就好 note是 2639352
- 通过系统函数分配内存sbrk/sbrk
#include <unistd.h> #include <stdio.h> int main(void) { printf("================brk ...
- clickhouse-数据副本踩坑
数据副本--失败,看日志 vim /var/log/clickhouse-server/clickhouse-server.err.log select * from system.replicati ...
- 在回显时遇到的问题,回显的值无法显示到页面 vue
//理解为 重新渲染 this.form的数据 1 this.form = Object.assign({}, this.form)
- IDEA EduTools Plugin Learning Cause
背景 编程培训需求,能够检测学生的输入内容与预期一致,有课程大纲 IDEA Plugin EduTools 是一个非常出色的培训工具,具备在IDE中学习,能够通过单元测试验证正确错误,能够设置用户输入 ...
- 使用pip安装PySide6
https://www.perfcode.com/p/pip-install-pyside6.html 要求 在安装PySide6之前,你必须先安装Python 3.6 以上版本: 安装PySide6 ...
- 123data路径
/zhf/Innosky2021/data/dayantahttp://123.xx.xx.147:8888/cesiumdemo/data/dayanta/tileset.json