标签:
之前简单介绍了XLinq的一些功能,有很多功能都没有提到,现在给XLinq加了一些功能,这次把所有功能都介绍一遍。
在使用一个框架的时候
应该没几个人会喜欢写一大堆的配置文件吧
也应该没几个人会喜欢为了完成一个小功能却需要写一大堆代码
这是XLinq开发的首要目标之一,就是尽可能提高易用性
最小配置的情况下仅需要一句连接字符串的配置就可以使用
默认支持的是Sql Server 2008 R2数据库,理论上说也大部分支持了sql server系的其他数据库
目前针对查询时的DataReader转List和批量插入有针对性优化,其他的不太重要的例如批量更新这个并没有太多优化
出了问题能够以最快速度让使用者定位到问题,其实这些是细节问题
这个其实是跟易用性挂勾的,园子里面有大神写的ORM,声称"无Linq",其实我也不太想用Linq,因为解析Linq实在太难,坑太多,但又找不到另一种比Linq更让我满意的方案。然后我去看了他的ORM的使用方法,发现一旦复杂起来不见得会比Linq更清晰,并且实体类的设计实在是···
Linq实现复杂的语法确实比较蛋疼,sql语句里面直接来几个case when,linq就得写晕过去,至少解析的时候会晕过去。
但在我看来,既然linq语句都比较复杂了,那肯定是有很多的逻辑在里面,就像上面说的case when,那么为什么不把这些逻辑分拆成好几个linq去执行呢?或者干脆点写存储过程里面。
Lambda版:
LINQ版:
LINQ版看起来明显感觉比较麻烦,所以在简单查询的时候我更倾向于Lambda表达式
上面的语句生成的代码是一致的
建立实体类的过程不再说
两个表连接查询,因为用Lambda实现比较复杂,所以后面都不再用Lambda实现
生成的语句
五个表连接查询
生成的语句
因为linq本身的左连接写法比较蛋疼,所以xlinq也没有办法,后面会想办法简化
生成的语句
生成的语句
生成的语句
生成的语句
这个功能主要针对EF中无法直接取日期的问题
生成的语句
Update子句必须采用这写法才会有效
在调试的时候可直接看到SQL语句
通过配置文件实现多数据库支持
有没有园友注意到,我上面用的User实体并没有进行任何特殊处理,但实际翻译出来的语句是识别的Users表
这其实是"抄"的EF的约定大于配置的原则,默认情况下,实体名的复数就是表名,实体中的Id识别为主键并自动增长
如果需要自定义这些规则,则需要使用特性或链式API,我现在更喜欢链式API
重写DataContext的ConfigurationModel方法即可使用链式API对实体相关信息进行配置,上面是指定了User实体的表名、主键及主键的数据来源为自动增长
若要创建表,则几乎必须使用链式API对实体进行配置之后才能进行自动创建
另外这个功能有一定的限制,默认情况下不会启用该功能,若启用了也只有在数据库中一个表都没有的情况下才会自动创建表
这样做是因为真正的数据库运行环境其实很可能压根不允许自动创建表,然后就是下面这个样子,这样一来这个功能其实并没有太大用,只有在第一次初始化数据库的时候才会用。
当然也可以始终自动创建表,这个需要稍微配置一下,当allwayAutoCreateTables为true时并且autoCreateTables为true时,将始终自动创建表
下面演示创建一个Test表
DataContext中的配置
创建的表
测试结果
查询一次的情况下EF慢的妥妥的,XLinq微弱优势
查询N次的情况下EF这···还有人说EF慢?不过大概是因为缓存的原因,但最后一张图看着又不太像,或许还跟GC什么的关吧,所以还有人说EF慢么··
或者是我测试代码有问题?
测试结果
http://files.cnblogs.com/files/wzxinchen/XlinqDemo.zip
标签:
原文地址:http://www.cnblogs.com/wzxinchen/p/4700506.html