简介:在.NET Framework下有许多ORM框架,最著名的无外乎是Entity Framework,它拥有悠久的历史以及便捷的语法,在占有率上一路领先。但随着Dapper的出现,它的地位受到了威胁,本文对比了在.NET Core下 两种框架的表现以 ...
在.NET Framework下有许多ORM框架,最著名的无外乎是Entity Framework,它拥有悠久的历史以及便捷的语法,在占有率上一路领先。但随着Dapper的出现,它的地位受到了威胁,本文对比了在.NET Core下 两种框架的表现以及与原生的ADO.NET 的对比。1. Dapper是什么Dapper是.NET的简单对象映射器,在速度方面拥有微型ORM之王的称号,几乎和使用原始ADO.NET数据读取器一样快。 ORM是一个对象关系映射器,它负责数据库和编程语言之间的映射。Dapper是通过对IDbConnection接口的扩展来操作数据库的。2. 为什么选择Dapper2.1. Dapper和Entity Framework Core的比较
object param = new { Id = Id }; return conn.Query<Post>("select * from Posts where Id=@Id", param, buffered: true).First();生成的Sql select * from Posts where Id = 501Entity Framework ctx.Posts.FirstOrDefault(p => p.Id == Id) as Post;生成的Sql语句 SELECT `p`.`Id`, `p`.`Counter1`, `p`.`Counter2`, `p`.`Counter3`, `p`.`Counter4`, `p`.`Counter5`, `p`.`Counter6`, `p`.`Counter7`, `p`.`Counter8`, `p`.`Counter9`, `p`.`CreationDate`, `p`.`LastChangeDate`, `p`.`Text`FROM `Posts` AS `p`WHERE `p`.`Id` = 501LIMIT 1
var idParam = cmd.Parameters.Add("@Id", System.Data.SqlDbType.Int);MySql var idParam = cmd.Parameters.Add("@Id", System.Data.DbType.Int32);Sql Server using (var reader = cmd.ExecuteReader()){ reader.Read(); obj = new Post { Id = reader.GetInt32(0), Text = reader.GetNullableString(1), CreationDate = reader.GetDateTime(2), LastChangeDate = reader.GetDateTime(3), Counter1 = reader.GetNullableValue<int>(4), Counter2 = reader.GetNullableValue<int>(5), Counter3 = reader.GetNullableValue<int>(6), Counter4 = reader.GetNullableValue<int>(7), Counter5 = reader.GetNullableValue<int>(8), Counter6 = reader.GetNullableValue<int>(9), Counter7 = reader.GetNullableValue<int>(10), Counter8 = reader.GetNullableValue<int>(11), Counter9 = reader.GetNullableValue<int>(12), };}MySql using (var reader = cmd.ExecuteReader()){ reader.Read(); obj = new Post { Id = reader.GetInt32(0), Text = reader.GetString(1), CreationDate = reader.GetDateTime(2), LastChangeDate = reader.GetDateTime(3), Counter1 = reader.GetValue(4) as int?, Counter2 = reader.GetValue(5) as int?, Counter3 = reader.GetValue(6) as int?, Counter4 = reader.GetValue(7) as int?, Counter5 = reader.GetValue(8) as int?, Counter6 = reader.GetValue(9) as int?, Counter7 = reader.GetValue(10) as int?, Counter8 = reader.GetValue(11) as int?, Counter9 = reader.GetValue(12) as int?, };}修改EntityFrameworkExecuter public Post GetItemAsObject(int Id){ return ctx.Posts.Where(p => p.Id == Id) as Post;}修改为 public Post GetItemAsObject(int Id){ return ctx.Posts.FirstOrDefault(p => p.Id == Id);}或 public Post GetItemAsObject(int Id){ return ctx.Posts.Where(p => p.Id == Id).FirstOrDefault();}因为Posts.Where(p => p.Id == Id)想让它生成的结果是: SELECT `p`.`Id`, `p`.`Counter1`, `p`.`Counter2`, `p`.`Counter3`, `p`.`Counter4`, `p`.`Counter5`, `p`.`Counter6`, `p`.`Counter7`, `p`.`Counter8`, `p`.`Counter9`, `p`.`CreationDate`, `p`.`LastChangeDate`, `p`.`Text`FROM `Posts` AS `p`WHERE `p`.`Id` = 501但是结果却是: SELECT `p`.`Id`, `p`.`Counter1`, `p`.`Counter2`, `p`.`Counter3`, `p`.`Counter4`, `p`.`Counter5`, `p`.`Counter6`, `p`.`Counter7`, `p`.`Counter8`, `p`.`Counter9`, `p`.`CreationDate`, `p`.`LastChangeDate`, `p`.`Text`FROM `Posts` AS `p`由于官方Mysql的Entity Framework存在问题,这里使用了第三方的Pomelo.EntityFrameworkCore.MySql包
3. 总结本文中使用原生ADO.Net和轻量级ORM框架Dapper和官方提供的ORM框架Entity Framework Core同时操作Mysql数据时循环500次查询一条数据时所耗时间和一次性取5000条数据所消耗时间比较;如果你喜欢Sql或你的数据库不复杂,那么Dapper是你的不二之选,它性能接近原生ADO.Net有些地方还要更优于,操作也比较方便。参考资料https://github.com/StackExchange/Dapperhttp://dapper-tutorial.net/dapper 作者:xdpie 出处: http://www.cnblogs.com/vipyoumay/p/7942621.html本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.rzxsoft.cn学习互联网营销技术请到巅云建站www.rzxsoft.cn。 |







