ORM之一:适合我的ORM
一、常见开源ORM框架
比喻:Kerosene ORM,DbLinq,Dapper,DynamicQuery,elinq,glinq,NPoco,Relinq,EF,ServiceStack.OrmLite,IQToolkit,对于这些框架,在单表查询这块支持的还蛮可以,但是对于多表查询的那种语法,我真有点接受不了,总感觉怪怪的,直观感觉就是没有了linq语法的那种美感,请忽视我的挑剔与自不量力,纯属个人喜好。
例如:
var cmd = link
.From( x => x.Employees.As( x.Emp ) )
.Join( x => x.Countries.As( x.Ctry ).On( x.Emp.CountryId == x.Ctry.Id ) )
.Select( x => x.Emp.Id, x => x.Emp.FirstName, x => x.LastName )
.Select( x => x.Ctry.Id, x => x.Ctry.Name )
.OrderBy( x => x.Emp.Id );
List<School> dataList = db.Sqlable()
.Form("school", "s")
.Join("student", "st", "st.id", "s.id", JoinType.INNER)
.Join("student", "st2", "st2.id", "st.id", JoinType.LEFT).Where("s.id>100 and s.id<@id").SelectToList<School>("st.*", new { id = 1 });
var joinQuery = new JoinSqlBuilder<User, User> ().
LeftJoin<User, Address> (x => x.Id, x => x.UserId).ToSql ();
var testQuery = from c in db.Customers
from o in c.Orders
from d in o.Details
where o != exclude
select d; var test = testQuery.ToList();
var query = from c in db.Customers
where c.CustomerID == "ALFKI"
join o in db.Orders on new {a = c.CustomerID, b = c.CustomerID} equals
new {a = o.CustomerID, b = o.CustomerID}
select new {c, o};
等等。其次就是代码量相当庞大,阅读起来费力,虽然都是从接口、抽象类开始阅读,而且调试起来去理解它的代码需要耗费大量时间,且相关文档有些不完整。再次陷入了困境,前前后后也花了一些时间,于是静下心来想想,为何我不重新梳理下自己的计划了,原本是想在前人的基础上去修改修改就变成自己的了,但是核心代码还是别人的,自己没有掌握关键技术。看来这条路走不通了,只能靠自己了。
二、ORM所需具备的条件
在日常开发中,如果是做业务逻辑开发一定会离不开单表增删改查、多表关联查询、存储过程、分页、聚合函数使用等。这里插播一段,因为我主要做后端开发以及框架搭建,平日最讨厌某某说,后台不就是增删改查吗?只要一听到类似的话语,我心中立即会有10万头草泥马向他奔去,鄙夷感顿生。但是马上会说,你怎么知道就只有增删改查了?哈哈。有点扯远了。不管是业务逻辑离不开这些,就一些框架组件也会将一些数据持久化,它们也离不开与数据库打交道。那么我觉得这个ORM必须具备如下条件:
A、支持CRUD标准接口;
B、支持多表联合查询接口,并且使用linq语法,但是一定不使用linq的那个join方式;
C、支持聚合函数、支持分组以及hanving、支持存储过程调用、支持分页,支持sql语句,支持事务;
D、支持部分常用C# 函数调用;
E、支持与元数据进行映射的工具;
F、能扩展oracle,mysql等主流数据库;
如果能满足上述6个大条件,那么这个轮子基本上就满足日常开发中80%左右的场景了,那么快速开发也就不在话下了。
三、适合我的ORM操作示例
有了上面的基础,结合一下目前主流的ORM框架,那么就可以想象下ORM的部分使用示例了。
A、单表增删改查
Insert:
Db<T>.Insert(实体对象);
Delete:
Db<T>.Delete(w => w.条件字段== );
Update:
Db<T>.Update(up => new 实体对象{需要修改字段= "xxxxxx" }, wh => wh.条件字段== );
Select:
Db<T>.Single(w => w.条件字段.Contains("@")); //单条记录
Db<T>.Select(w => w.条件字段.Contains("@")); //多条记录
B、多表联合查询
join:
var results = (from u in Db<T>.查询对象a
join ur in Db<T>.查询对象b on new
{
u = u.条件字段1,
a = u.条件字段2
} equals
new
{
u = ur.条件字段1,
a = ur.条件字段2
}
join r in Db<T>.查询对象c on ur.条件字段3 equals r.条件字段3
where u.条件字段4 ==
orderby u.条件字段5
select new object //可以匿名 select new
{
v= u.字段,
vv= u.字段,
vvv= u.字段,
vvvv= r.字段
}).设置表关联类型(类型Inner, 类型.left);
分页:
results.Page(,);
C、存储过程
var dbParameters = new DbParameterCollection
{
new DbParameter{DbType = DbType.Int32,Name = 输入参数名称,Value = ,Direction = ParameterDirection.Input},
new DbParameter{DbType = DbType.Int32,Name = 输出参数名称,Direction = ParameterDirection.Output }
}; var affectCount = Db.执行存储过程(存储过程名称, 存储过程参数); //这里是返回影响行数,还可以扩展返回ilist<T>集合,dataset对象 var returnc = dbParameters[output参数名称].Value;
D、执行sql语句
var ds = Db.执行查询("select * from demoTable"); //还可以扩展返回ilist<T>集合,影响行数等
foreach (DataRow row in ds.Tables[].Rows) { Console.WriteLine(row[]); }
E、事务
using (var 数据库对象提供者实例= Db.默认实例)
{
try
{
Begin(); //开始事务 //to do... Commit(); //提交事务
}
catch (Exception)
{
Rollback(); //回滚事务
}
}
F、多表联合查询分组
var resultList = (from a in Db<T>.查询对象1
join b in Db<T>.查询对象1 on a.条件字段1 equals b.条件字段2
group new {对象a, 对象b} by new {对象a.字段}
into g
where g.Sum(m=>m.对象b.字段)>
select new
{
userId= g.Key.对象a.字段,
TotalScore = g.Max(b => b.对象b.字段) }).ToList();
G、其他就不一一列举了,具体详见后续博文。
ORM之一:适合我的ORM的更多相关文章
- SOD框架的数据容器,打造最适合DDD的ORM框架
SOD框架的数据容器,打造最适合DDD的ORM框架 引言:DDD的困惑 最近,我看到园子里面有位朋友的一篇博客 <领域驱动设计系列(一):为何要领域驱动设计? >文章中有下面一段话,对DD ...
- DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
引言:DDD的困惑 最近,我看到园子里面有位朋友的一篇博客 <领域驱动设计系列(一):为何要领域驱动设计? >文章中有下面一段话,对DDD使用产生的疑问: •没有正确的使用ORM, 导致数 ...
- ORM系列之一:Dos.ORM
阅读目录 引言 1.为什么使用Dos.ORM 2.配置 3.开始使用 3.1. 物理表 3.2. 实体类 3.3. 使用方法 引言 Dos.ORM(原名Hxj.Data)于2009年发布,2015年正 ...
- Dos.ORM logo.Net轻量级开源ORM框架 Dos.ORM
http://www.oschina.net/p/dos-orm http://www.oschina.net/project/lang/194/csharp http://www.cnblogs.c ...
- 转:C#制作ORM映射学习笔记三 ORM映射实现
现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- ORM框架介绍——什么是ORM框架?
1.什么是ORM?对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM框架是连接数据库的桥梁,只要提供 ...
- 【手撸一个ORM】第九步、orm默认配置类 MyDbConfiguration,一次配置,简化实例化流程
这个实现比较简单,事实上可配置的项目很多,如有需要,请读者自行扩展 using System; namespace MyOrm { public class MyDbConfiguration { p ...
- 存在即合理,重复轮子orm java版本
1,业务描述前序? 需求来源于,公司的运营部门.本人所在公司(私营,游戏行业公司),从初创业,我就进入公司,一直致力于服务器核心研发. 公司成立块3年了,前后出产了4款游戏,一直在重复的制造公司游戏对 ...
随机推荐
- ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引 因为表KOL_XX_FIN050_TEMP 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba ...
- Scrapy在win7 32位的安装及依赖包
Scrapy,一个网络爬虫的框架,首先第一步肯定是安装. 参考网上的文章. 安装过程中需要用到pip工具,请自行安装. 1.安装python 这个是必须的,既然都用到scrapy了,肯定已经安装了py ...
- A*算法完全理解
注:原文出自Patrick Lester,一稿翻译为Panic.很久以前的老文章了,但我觉得真的非常的经典,想把它完善一下让以后的人能够更好的体会原作者和原翻译的精髓吧.我在此基础上修改了部分译文,更 ...
- windows官方多语言方案
编写 Win32 多语言用户界面应用程序 Windows 2000 针对全球市场制定了新的增强支持标准,提供了许多国际化功能,例如完全支持 Unicode.预设支持数百种语言以及用于从右向左语言的镜像 ...
- jqGrid如何实现单选。
设置如下:multiselect:true // multi-select checkboxes appear multiboxonly:true // checkboxes act like rad ...
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...
- C#多线程下载一个文件
这里只是说明多线程下载的理论基础,嘿嘿,并没有写多线程下载的代码,标题党了,但是我相信,看完这个代码就应该能够多线程的方式去下载一个文件了. 多线程下载是需要服务器支持的,这里并没有判断服务器不支持的 ...
- 安装GNS3-0.8.6-all-in-one时language里没有选项
初次安装使用GNS3,安装的版本是GNS3-0.8.6-all-in-one,本人也是菜鸟,安装时都是一路 Next,结果安装后运行出现了这样的问题,如图 language里是没有选项的,解决方法 把 ...
- bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...
- 50道经典的JAVA编程题 (1-5)
后天java考试,现在闲着也是闲着,来做做java题吧. 前不久在网上看见了50道java算法编程题,感觉还不错,记得大一学C语言的时候做过一些,现在用java来回顾下吧,也算应付考试吧. 代码要是有 ...