当前位置:编程学习 > C#/ASP.NET >>

实体框架?nhibreate?见识一下另一个为实战而生的Orm


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

一、使用sql及存储过程

1)使用List<Dictionary<string, MObject>>

1.使用sql

string sql="select * from Class where ClassName = @";
string sql2="select * from Class where DateTimem = @";
List<Dictionary<string, MObject>> mylist=db.ExecuteSqlToDictionaryList(sql,"boy'");
List<Dictionary<string, MObject>> mylist2=db.ExecuteSqlToDictionaryList(sql2,DateTime.Parse("2013-10-10 14:40:08"));
foreach(var oneClass in mylist){
                    string className=oneClass["className"].To<string>();
                    long id=oneClass["Classid"].To<long>();
                    DateTime datetimem=oneClass["datetimem"].To<DateTime>();//不用区分大小写
                    Console.WriteLine(className+"  "+id+"  "+datetimem);
}

2.使用mql

var  list=db.GetDictionaryList(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(0)))
 
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
2.6 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))); 
            }
        }
 

 
3)使用DataSet

 1.使用存储过程
DataSet dataset=db.ExecuteProToDataSet("存储过程名",参数一,参数二);

2.使用sql
DataSet dataset=db.ExecuteSqlToDataSet(sql,"boy");
3.使用mql
DataSet dataset=db.GetDataSet(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(0)));

 
4)使用xml配置sql查询

1.配置config节点

 
<appSettings>
    <add key="SQL_XML_FILE_NAME" value="C:\Moon\Moon.Orm\sql.xml"></add>//如果不是全路径,则默认在dll生成目录
</appSettings>

 

2.配置xml(sql.xml)

 
<?xml version="1.0"?>
<sqls>
    <sqlxml id="getname">
        <sql>select name from user where id>@</Sql>
        <description>查询用户名(描述信息)</Description>
    </sqlxml>
</sqls>
 3.使用id进行查询

 

 
var list=db.GetDictionaryList(XmlHelper.GetSqlXmlByID("getname"),"boy");

 
5)无需实体类的设计思路

使用GetDynamicList ,让你体验另一种自由

 
object,但在.net 4.0下面,您可以用dynamic直接取值.
string sql22="select * from Score";
dynamic list22=db.GetDynamicList(sql22,"Score");
foreach(var a in list22){
       Console.WriteLine(a.ID+"--"+a.ScoreM+"--"+a.UserID+"--"+a.TypeName);//都是强类型
}

以下是体验强类型:)
 
 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

请加入第二个群
225656797

 

 

最近新闻
1)Moon.ORM5.0(MQL版) 隆重发布社区版代码生成器
2)Moon.ORM开源等重要疑问,您可以在线留言(有技术问题的话)
3)Moon.Orm 5.0 (MQL版) 版本维护及下载(跟踪发布)
4)Moon.ORM5.0总目录
支付宝:zhan_jp1989@126.com (请注明您的邮箱)
5)获取Moon.Orm5.0源代码的方式

 

 
相关博文1)Moon.Orm 5.0 (MQL版) 配置说明;
2)Moon.Orm 5.0 (MQL版) 版本维护及下载(跟踪发布);
3)Moon.Orm 5.0系列文章; 
4)Moon.Orm全面介绍;
--------------------编程问答-------------------- 去官方论坛看看 --------------------编程问答-------------------- 为什么放着开源的Nhibernate和微软官方的EF不用,要用你这个ORM呢?
基本上能写出这个ORM算是水平不错,但是选择用你这个框架的人就属于愚蠢的人 --------------------编程问答-------------------- 你说性能比EF高5倍,请问你的测试方法是什么,测试用例在哪里,测试结果能否公开。 --------------------编程问答-------------------- EF是开放源代码的,我不知道你是否开源,但是从你的描述看,要想在广泛的测试用例下取得比EF更好的性能基本不可能,因为你除了丢弃了一些你认为EF中你觉得实现得费劲的功能以外,没有看到你为性能优化而采用任何措施。 --------------------编程问答--------------------
引用 3 楼 caozhy 的回复:
你说性能比EF高5倍,请问你的测试方法是什么,测试用例在哪里,测试结果能否公开。

我那里说了五倍,不过绝对成倍数.自己测试吧
 




引用 2 楼 zhuawang 的回复:
为什么放着开源的Nhibernate和微软官方的EF不用,要用你这个ORM呢?
基本上能写出这个ORM算是水平不错,但是选择用你这个框架的人就属于愚蠢的人

呵呵,5.0之前全开源了,5.0步步开源,你也可以加入获取开源.


给你们测试代码
 http://www.cnblogs.com/humble/p/3307492.html

给你开源地址
http://www.cnblogs.com/humble/p/3323161.html --------------------编程问答-------------------- 给全面的介绍地址

http://www.cnblogs.com/humble/p/3320804.html

邮件联系:
qsmy_qin(at)163.com --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 提几点建议,希望楼主能考虑一下:
1、高性能不应该停留在高效的数据转换这个层次,更重要的是提供配套的Cache机制。
2、易用性不应该是BiggerThan这类东西,.NET2.0同样可以使用lambda Expression,主要是vs编译器版本的支持,实现一套Expression花不了多少时间。
3、ORM如果仅仅用来替代SQL,个人认为意义不大。
另外有一点个人经验,ORM如果只支持的单表SQL查询,有利于自动化的实现,有利于基于Cache的性能优化,而且使用也会更简单。 --------------------编程问答--------------------  

引用 8 楼 sbwwkmyd 的回复:
提几点建议,希望楼主能考虑一下:
1、高性能不应该停留在高效的数据转换这个层次,更重要的是提供配套的Cache机制。
2、易用性不应该是BiggerThan这类东西,.NET2.0同样可以使用lambda Expression,主要是vs编译器版本的支持,实现一套Expression花不了多少时间。
3、ORM如果仅仅用来替代SQL,个人认为意义不大。
另外有一点个人经验,ORM如果只支持的单表SQL查询,有利于自动化的实现,有利于基于Cache的性能优化,而且使用也会更简单。

1.内置cache
2.这个后半句,我可真不统一.不过可以在2.0使用,有一个开源的
3.不是为了替代sql
4.你说的都有.
--------------------编程问答-------------------- 个人感觉,做.NET的很少有人真的关心性能问题,有的那几人都有自己的一套方案。
而对于其它人,一般不会有人冒着“不稳定”的风险使用第三方的类库,除非你能不可替代的解决一般人的问题。 --------------------编程问答-------------------- 说实话,一直对ORM这种东西不怎么感冒,感觉好像.net这边,稍微觉得自己有点水平的人都会写一个ORM来显示自己的能力。但是实际情况是,除了开发者本人,真实生产敢用这种框架的团队或者说企业,是少之又少。小公司基本是使用成熟的大公司ORM框架,有点技术实力的公司如果需要的话会根据自己的需求写一个ORM。
--------------------编程问答--------------------
引用 1 楼 Aoqun 的回复:
去官方论坛看看

一看就知道一个没见过世面的新手,居然把别人的博客叫做官方论坛,博客和论坛的区别都没搞清楚。
至于速度,肯定没有Dapper的高,如果仅仅和EF、nhibreate去比较,那不能说明它的效率,因为任何轻量级的第三方框架速度上都可以超过复杂的EF。你有本事我手写SQL的执行效率去比较,如果速度几乎一样,那才能说明效率高,Dapper就可以做到。 --------------------编程问答--------------------
引用 11 楼 wddw1986 的回复:
说实话,一直对ORM这种东西不怎么感冒,感觉好像.net这边,稍微觉得自己有点水平的人都会写一个ORM来显示自己的能力。但是实际情况是,除了开发者本人,真实生产敢用这种框架的团队或者说企业,是少之又少。小公司基本是使用成熟的大公司ORM框架,有点技术实力的公司如果需要的话会根据自己的需求写一个ORM。
我相信大多数人写ORM都是为了解决实际问题。
引用 12 楼 qldsrx 的回复:
至于速度,肯定没有Dapper的高,如果仅仅和EF、nhibreate去比较,那不能说明它的效率,因为任何轻量级的第三方框架速度上都可以超过复杂的EF。你有本事我手写SQL的执行效率去比较,如果速度几乎一样,那才能说明效率高,Dapper就可以做到。
不知道什么时候Emit效率一定高于代码生成了,呵呵。只要不是频繁使用反射,效率问题都不应该出现数据转换这一块。 --------------------编程问答--------------------
引用 11 楼 wddw1986 的回复:
说实话,一直对ORM这种东西不怎么感冒,感觉好像.net这边,稍微觉得自己有点水平的人都会写一个ORM来显示自己的能力。但是实际情况是,除了开发者本人,真实生产敢用这种框架的团队或者说企业,是少之又少。小公司基本是使用成熟的大公司ORM框架,有点技术实力的公司如果需要的话会根据自己的需求写一个ORM。


能达到你的效率,这点本事都没有,就不用推荐了.
没有验证过就知道实际?这不求实.
--------------------编程问答--------------------
引用 12 楼 qldsrx 的回复:
Quote: 引用 1 楼 Aoqun 的回复:

去官方论坛看看

一看就知道一个没见过世面的新手,居然把别人的博客叫做官方论坛,博客和论坛的区别都没搞清楚。
至于速度,肯定没有Dapper的高,如果仅仅和EF、nhibreate去比较,那不能说明它的效率,因为任何轻量级的第三方框架速度上都可以超过复杂的EF。你有本事我手写SQL的执行效率去比较,如果速度几乎一样,那才能说明效率高,Dapper就可以做到。

用了之后,再说它的性能如何,给你们测试代码了,你们也不测试.实际求实地说话才是做东西.
--------------------编程问答--------------------
引用 13 楼 sbwwkmyd 的回复:
Quote: 引用 11 楼 wddw1986 的回复:
说实话,一直对ORM这种东西不怎么感冒,感觉好像.net这边,稍微觉得自己有点水平的人都会写一个ORM来显示自己的能力。但是实际情况是,除了开发者本人,真实生产敢用这种框架的团队或者说企业,是少之又少。小公司基本是使用成熟的大公司ORM框架,有点技术实力的公司如果需要的话会根据自己的需求写一个ORM。
我相信大多数人写ORM都是为了解决实际问题。
引用 12 楼 qldsrx 的回复:
至于速度,肯定没有Dapper的高,如果仅仅和EF、nhibreate去比较,那不能说明它的效率,因为任何轻量级的第三方框架速度上都可以超过复杂的EF。你有本事我手写SQL的执行效率去比较,如果速度几乎一样,那才能说明效率高,Dapper就可以做到。
不知道什么时候Emit效率一定高于代码生成了,呵呵。只要不是频繁使用反射,效率问题都不应该出现数据转换这一块。


谁说我的实体映射用EMIT反射了?不知道情况就不要信口开河. --------------------编程问答--------------------
引用 12 楼 qldsrx 的回复:
Quote: 引用 1 楼 Aoqun 的回复:

去官方论坛看看

一看就知道一个没见过世面的新手,居然把别人的博客叫做官方论坛,博客和论坛的区别都没搞清楚。
至于速度,肯定没有Dapper的高,如果仅仅和EF、nhibreate去比较,那不能说明它的效率,因为任何轻量级的第三方框架速度上都可以超过复杂的EF。你有本事我手写SQL的执行效率去比较,如果速度几乎一样,那才能说明效率高,Dapper就可以做到。
Dapper确实可以 有人测过 总体速度不错  不知道为什么Entity framework 测试起来速度不佳 --------------------编程问答--------------------
引用 16 楼 Aoqun 的回复:
谁说我的实体映射用EMIT反射了?不知道情况就不要信口开河.
我说的是Dapper,你的既然是代码生成可能就是硬编码了 --------------------编程问答--------------------  

引用 18 楼 sbwwkmyd 的回复:
Quote: 引用 16 楼 Aoqun 的回复:
谁说我的实体映射用EMIT反射了?不知道情况就不要信口开河.
我说的是Dapper,你的既然是代码生成可能就是硬编码了


EF,生成model,也叫硬编码? --------------------编程问答--------------------
引用 19 楼 Aoqun 的回复:
 

Quote: 引用 18 楼 sbwwkmyd 的回复:

Quote: 引用 16 楼 Aoqun 的回复:
谁说我的实体映射用EMIT反射了?不知道情况就不要信口开河.
我说的是Dapper,你的既然是代码生成可能就是硬编码了


EF,生成model,也叫硬编码?
我只是说可能,EF的DB frist仅仅是生成model,并没有生成数据转换代码。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,