分享刚出炉的ORM框架XLinq

吐嘈

忙活了一个多月,XLinq总算"能用"了,BUG总算"少点"了,准备真正替代EF了,现在已经初步在自己的项目中使用了

EF这家伙,优点不少,缺点也不少,我就扯几个最让我头大的缺点(或许这里面的缺点是因为我不会用)

  1. 必须将所有实体一次写完整,不能通过DbContext.Set<T>方法动态加载实体
  2. NoLock,硬伤啊,貌似就算用事务然后配置成ReadUncommited也不行
  3. EF支持的LINQ各种坑,简单说几个
    1. .Where(x=>x.LastLogin==DateTime.Now.Date),很简单很常用的代码么,但EF就是不支持
    2. .Where(x=>x.Name==null),看起来好像没问题,但EF却翻译成了where name=null,坑货
    3. 左连接!不说实现左连接那郁闷的写法,郁闷的是EF不一定会给那种写法翻译成左连接
    4. 第三点吐嘈完毕
  4. 删除、更新,必须先查询再进行删除和更新
  5. 性能,其实性能这个好像也没那么差,测试过查询16万数据,近一百个字段,尼玛居然16秒就搞定了····
  6. 暂时想不起来

分享

吐嘈EF的人也不少了,我再这么就吐嘈两下完事的话有点没事找事···

所以,针对上面这些坑,我找了很多的ORM(其实好像也不多),试过alinq、dbentry.net,alinq不说,收费的,用不起···后面这个的话,当时被坑多了,就没用过了,对了,还有SOD,大神深蓝医生写的···

然而我自己也曾写过支持LINQ的ORM,但那代码渣的够可以,不过总算写过,知道些原理,其实更多的是为了锻炼,毕竟要支持LINQ的话,难度是比较大的,所以这一次又再一次自己写,功能从简单起见,主要有以下功能

  1. 支持简单的LINQ查询,多表连接查询(不支持任意形式的嵌套查询)

    LINQ一旦写复杂了,确实要生成高性能的SQL非常难,因为就算生成能执行的sql都比较难。我更倾向于将业务拆分,变成简单的LINQ语句能完成的功能。嵌套查询或许以后会支持,但到时候估计就是一堆坑

  2. 支持动态加载实体

    不需要事先在DbContext里面把实体写好,事实上什么都不写都行,主要是为了便于封装数据层,否则的话我每添加一张表都不得不去DbContext里面加一个实体

  3. 支持在LINQ中调用方法和属性,例如.Where(x=>Convert.ToBoolean(x.IsEnabled))

    上面这个写法在EF中是绝对不支持的,另外还支持Date属性访问

  4. 多数据库支持

    目前只支持了sqlite和sql server 2008 r2,应该说只要sql server 2008 r2支持了,那就可以部分支持其他sql server数据库了

  5. 支持自己编写翻译成sql的代码(未测试)

    可以自定义生成自己想的sql

  6. 支持最小化配置,最小仅需要一个连接字符串

    说这个我又要说java了,连hello world都没跑起来却搞了三天的配置,多麻烦!

  7. 基本兼容EF的使用方法

    降低学习成本

  8. 不需要查询,直接更新和删除数据

    调用的方式和EntityFramework Exnteded类似,这也算是EF的又一个硬伤

  9. 支持NOLock
  10. 其他我说漏掉的

使用方法

  1. 配置文件

    这里只说最小化配置

  2. 建立数据库

    我随便建的xlinq数据库,建了一个Users表,有两个字段,Id和Username,其中Id为自增并且是主键

  3. 建立实体

  4. 测试插入

    终于到这儿了

    怎么的,这跟EF的写法不是一模一样的?

    运行结果:

  5. 测试查询

    为什么要把插入放前面?因为插入了之后才有数据查询

    运行结果:

  6. 测试更新

    更新有两种方法,先查询再更新和直接更新

    第一种:

    运行结果:

    第二种:

    运行结果:

  7. 测试删除

    删除也有查询后删除和直接删除两种,这里只说直接删除

  8. NOLOCK

后记

看着挺简单的基本功能,但做起来真是一把辛酸泪。计划中还有性能测试的,不过先看有多少人关注吧!

测试源码:http://files.cnblogs.com/files/wzxinchen/XlinqDemo.zip

时间: 2024-10-23 21:33:41

分享刚出炉的ORM框架XLinq的相关文章

高性能ORM框架XLinq功能详细介绍

之前简单介绍了XLinq的一些功能,有很多功能都没有提到,现在给XLinq加了一些功能,这次把所有功能都介绍一遍. 设计目标 易用性 在使用一个框架的时候 应该没几个人会喜欢写一大堆的配置文件吧 也应该没几个人会喜欢为了完成一个小功能却需要写一大堆代码 这是XLinq开发的首要目标之一,就是尽可能提高易用性 最小配置的情况下仅需要一句连接字符串的配置就可以使用 默认支持的是Sql Server 2008 R2数据库,理论上说也大部分支持了sql server系的其他数据库 高性能 目前针对查询时

我的开发框架之ORM框架

今天我想分享一下我自己的ORM框架,虽然谈不是很好,但我个人认为还是蛮好用的,跟大家分享交流一下. 首先说说我对现在主流的ORM框架的一些看法: 优点: 让程序员不再关注数据库细节,专心在业务逻辑上,程序员可以不懂数据库就可以开发系统. 让数据库迁移变的非常方便,如果系统需要更改使用的数据库,直接改配制就好了,不要再管不同数据库之间的语法差异. 省时,可快速开发,因为不需要自己写复杂的SQL语句,不需要封装复杂的数据底层,这样可以节省很多时间. 缺点: 我觉得不懂数据库的程序员不是好程序员,OR

感恩回馈,新鲜出炉的《ASP.NET MVC 5框架揭秘》免费赠送

上次针对<ASP.NET Web API 2框架揭秘>举办了一次评论赠书活动,很多人问我相同的活动要不要针对<ASP.NET MVC 5框架揭秘>(阅读样章)再来一次,为此我向出版社要了10本,其中5本以评论博客的形式送出,另5本则以转发微博的形式送出,详细规则如下. 活动1 8月18.19.20.21.22(周一到周五)总计5天,在本帖,每天14点的第一个回帖评论者,分别赠送<ASP.NET MVC 5框架揭秘>1本.同一ID不可以重复参与活动,重复的话,取紧接着的下

分享自己写的基于Dapper的轻量级ORM框架~

1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. github:https://github.com/iamoldli/NetSql 2.使用方法 2.2.安装 Install-Package NetSql 2.2.创建实体 创建Article实体类,继承EntityBase public class Article : EntityBase {

优蜜(有米科技)面筋,香喷喷的,新鲜出炉

 优蜜(有米科技)面筋,香喷喷的,新鲜出炉 整个过程接近30分钟,感觉好快. 感觉面试官GG挺好人的,挺好说话的:是一对一面的.刚进去,他那里已有打印的简历(之前网申的简历,不是彩印的),我说自己带简历,是彩印的比较好点. 一开始,还是自我介绍:我没有全部发挥,只是简简单单介绍了下,1分钟多一点(平时都是两三分钟吧).接着,他看下简历,让我介绍一个我认为学得到比较多东西的项目(一般搞技术的不外乎都要将项目的,当然,也有例外).我挑简历中的第一个项目来说.讲完之后,面试官开始提问. 关于数据库缓存

DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和高效.今天特意写篇blog来记录我的心得与大家分享. [功能实现说明] 沿用上次的草图 目前DEMO图上的功能都已经实现.下面谈谈各部分的实现. 通信服务, 由DIOCP实现,担当与客户端的通信工作

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

打造android ORM框架opendroid(六)——级联查询

在上一篇博客<打造android ORM框架opendroid(五)--数据更新的实现>  我们介绍了opendroid数据更新的流程,也就在上次,我们OpenDroid类中的所有操作都介绍完了, 那查询操作呢?不是在OpenDroid中?查询操作是在OpenDroid中,不过是以内部类的形式呈现的. 还是来看看如果使用opendroid查询数据吧. OpenDroid.query.find(Student.class) OpenDroid.query.columns("stuNam

打造android ORM框架opendroid(三)——持久化数据

在上一篇博客<打造android ORM框架opendroid(二)--自动创建数据库>中,我们介绍了opendroid是怎么做到自动帮我们创建好数据库并通过反射拼凑出创建数据库的SQL语句,接着上面的博客,今天要来介绍一下opendroid数据库持久化(也就是insert操作)是怎么一个流程. 废话不多少,我们马上进入主题. ... 还记得通过opendroid我们是如何将数据保存到数据库的吗? 当时是调用了从OpenDroid类继承过来的save方法,来回顾一下吧. Student stu