打造Orm经典.Moon.Orm开源及技术文档发布.(您还用hibernate?实体框架?)

无聊的一个人啊 2013-09-14 12:26:10
一、Moon.Orm框架总述 (您还用hibernate?实体框架?)

1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架.

2.发展历史:历经近乎三年的发展历程,起因是EF框架的起初性能原因,为项目实战而生.

3.项目经验:经过数家公司项目实战、以及众多用户的肯定.
(因有格式丢失,请点此查看原版: 打造Orm经典.Moon.Orm开源及技术文档发布.(您还用hibernate?实体框架?)



Moon.Orm的追求方向:

1)高性能.
这也是架构创建的目的之一,已经将它的性能提升到了极致.大家可以自己测试.我可以说其性能是数一数二的.
连接地址:Moon洗冤录
2)易用性强
我想,用过Moon.ORM的应该可以知道这点.配置简单,智能感知,代码生成器的辅助,会sql就可使用之.
详情见,连接地址:Moon使用配置说明
3)多数据库多数据源支持
在同一个项目中我们常常需要处理这些情况时.目前moon的目标,支持sqlserver sqlite oracle mysql postgreSQL db2
如果您需要换数据库:直接修改配置文件然后一键生成实体层即可;

如果您需要多数据库:直接添加配置文件即可.详情:Moon使用配置说明

4)智能感知
这个不用讲了,值得一提的是MQL,她能够为你提供强大的智能感知功能,并且无数据库类型差异.

详情:MQL无linq化的战役

5).NET 2.0原生支持.
有人问:为什么没有LINQ、lambda,其实我只想说:没有必要做这些了,因为微软一个团队在做实体框架,去做一些不必要的事情,

真的没有意思. 觉得MQL复杂的兄弟们,有了智能感知,你们就适应适应,因为这是萝卜白菜的问题.

6) 使用便捷.
这个其实上面的链接也谈到,详情见:http://www.cnblogs.com/humble/p/3293500.html



二、Moon.Orm的功能预览



2.MQL查询分类讲解

2.1 MQL的标准查询
var mm=ClassSet.Select(ClassSet.ClassID,ClassSet.ClassName).
Where(ClassSet.ClassName.Contains("s").And(ClassSet.ClassID.BiggerThan(9)));



SELECT [Class].[ClassID],[Class].[ClassName] FROM [Class] WHERE [Class].[ClassName] LIKE @p1 AND [Class].[ClassID]>@p2
@p1=%s%
@p2=9
2.2 MQL的嵌套查询(含有Top查询:支持mysql、oracle、postgreSQL、sqlserver、sqlite)

var qiantao=ScoreSet.SelectAll().Where(
ScoreSet.UserID.In(UserSet.Select(UserSet.UserID).Where(
UserSet.ClassID.In(
ClassSet.Select(ClassSet.ClassID).Where(
ClassSet.ClassName.Equal(c.ClassName).And(ClassSet.ClassID.BiggerThan(0))
)
)
)
)
).Top(1);
SELECT TOP 1 [Score].* FROM [Score] WHERE [Score].[UserID] IN (SELECT [User].[UserID] FROM [User] WHERE [User].[ClassID] IN (SELECT [Class].[ClassID] FROM [Class] WHERE [Class].[ClassName]=@p1 AND [Class].[ClassID]>@p2 ) )
@p1=综合测试ClassName2
@p2=0
2.3 MQL的分组查询

var mql=ScoreSet.Select(ScoreSet.ScoreM.Sum().AS("sum"),ScoreSet.TypeName).
Where(ScoreSet.ScoreM.BiggerThanOrEqual(100)).

GroupBy(ScoreSet.TypeName).

Having(ScoreSet.ScoreM.Sum().BiggerThan(300));



SELECT SUM([Score].[ScoreM]) AS 'sum',[Score].[TypeName] FROM [Score] WHERE [Score].[ScoreM]>=@p1 GROUP BY [Score].[TypeName] HAVING SUM([Score].[ScoreM])>@p2
@p1=100
@p2=300
2.4 MQL的连接查询

var m1=ClassSet.Select(ClassSet.ClassID,ClassSet.ClassName)
.LeftJoin(
UserSet.Select(UserSet.UserID))
.ON(ClassSet.ClassID.Equal(UserSet.UserID))
.Where(UserSet.UserID.BiggerThan(9));
SELECT [Class].[ClassID],[Class].[ClassName],[User].[UserID] FROM [Class] LEFT JOIN [User] ON [Class].[ClassID]=[User].[UserID] WHERE [User].[UserID]>@p1
@p1=9
2.5 MQL的Union查询

var mql=ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(1))
.Union(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(2)));

var mql=ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(1))
.UnionAll(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(2)));


SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p1 UNION SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p2
@p1=1
@p2=2
SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p1 UNION ALL SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p2
@p1=1
@p2=2
3.MQL查询结果预览

public static void Main(string[] args)
{

using (var db=Db.CreateDefaultDb()) {
db.TransactionEnabled=true;
db.DebugEnabled=true;
Console.WriteLine("---------------嵌套查询---------------------");
var qiantao=ScoreSet.SelectAll().Where(
ScoreSet.UserID.In(UserSet.Select(UserSet.UserID).Where(
UserSet.ClassID.In(
ClassSet.Select(ClassSet.ClassID).Where(
ClassSet.ClassName.Equal(c.ClassName).And(ClassSet.ClassID.BiggerThan(0))
)
)
)
)
).Top(1);

Console.WriteLine("---------------分组查询---------------------");
var mql=ScoreSet.Select(ScoreSet.ScoreM.Sum().AS("sum"),ScoreSet.TypeName).Where(ScoreSet.ScoreM.BiggerThanOrEqual(100)).GroupBy(ScoreSet.TypeName).Having(ScoreSet.ScoreM.Sum().BiggerThan(300));

Console.WriteLine("---------------连接查询---------------------");
var m1=ClassSet.Select(ClassSet.ClassID,ClassSet.ClassName)
.LeftJoin(
UserSet.Select(UserSet.UserID))
.ON(ClassSet.ClassID.Equal(UserSet.UserID))
.Where(UserSet.UserID.BiggerThan(9));
}
Console.WriteLine("---------------Union测试---------------------");
using (var db=Db.CreateDefaultDb()) {
db.TransactionEnabled=true;
db.DebugEnabled=true;

var mql=ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(1))
.Union(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(2)));
}
}












三、Moon.Orm的开源发布

1)Moon.Orm 5.0之前的版本以(LGPL)开源发布



https://sourceforge.net/projects/moonorm/


2)之后的版本步步开源,对于参与者提供源代码.





如果您参与Moon.Orm的核心开发或辅助平台开发,您将直接获得5.0的源代码,有意者联系:qsmy_qin@163.com
当然您可以资金支持.十块钱那也是支持,请注明,您的邮箱地址.




5.0框架下载:http://www.cnblogs.com/humble/p/3298594.html
5.0社区版代码生成器下载:http://www.cnblogs.com/humble/p/3312018.html



四、Moon.Orm的技术文档

如果您喜欢它,请推荐支持一下吧:)

待续


...全文
256 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
@caozhy 你用Moon然后和EF对比一下,其性能是它的几倍.
  • 打赏
  • 举报
回复
@caozhy 你的推荐还不错.但你忽略了一点:EF的性能并不高.
threenewbee 2013-09-15
  • 打赏
  • 举报
回复
我想说说Lambda的问题。是这样的。

只要你牵涉到查询,就一定要处理查询表达式。C# 3.0的Lambda的工作原理是,C#编译器原生将你写的符合C#语法的Lambda表达式转换为查询表达式树这样的数据结构。
比如说
var query = data.Where(x => x.id > 1 && x.Name == "a");

相当于
param = Expression.Param("x", typeof(User));
body = Expression.And(
Expression.GreaterThan(
Expression.MakeMemberAccess(param, typeof(User).GetProperty("id"),
Expression.Constant(1)
),
Expression.Equals(
Expression.MakeMemberAccess(param, typeof(User).GetProperty("Name"),
Expression.Constant("a")
)
);
lambdaexpr = Expression.Lambda(param, body);
var query = data.Where(lambdaexpr);

(手写的,只是表示大概意思)

你可以看出来,和你的代码其实很类似。只是C#编译器能自动处理这个过程,使得我们既不用手写这些代码,而只要那简单的一行,也方便了代码的阅读。

理论上说,.NET 2.0完全可以实现Linq(开源的Linq Bridge就是这样一个项目,而你完全可以用这样的晦涩许多的语法,而不是Lambda去写)。

另外一种做法就是,允许调用者使用字符串形式的表达式,并且内置表达式到抽象语法树(AST)的解释器,这相当于重复编译器的语法解析操作。NHibernate等框架使用的是这个。不过幸好微软现在也开放了C#编译器API,叫做Roslyn。

总之,无论是lz的做法,还是NHibernate的做法,都不是创造发明,而只是开历史的倒车而已。你知道为什么这种"ORM"不会流行,也没有流行么?因为和基于Linq的API相比,这样的API体验太差了!

而且从发展的趋势来说,现在C# 2.0和更低版本的开发,已经收缩到一个极小极小的市场份额中。所以不引起关注也是很正常的。
  • 打赏
  • 举报
回复
好东西大家似乎都不感兴趣
  • 打赏
  • 举报
回复
欢迎大家指点

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧