在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?
Posted
技术标签:
【中文标题】在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?【英文标题】:What is the difference between how objects are handled in Dapper and Entity Framework - with raw SQL queries?在 Dapper 和实体框架中处理对象的方式有什么区别 - 使用原始 SQL 查询? 【发布时间】:2017-01-23 16:47:15 【问题描述】:根据我的阅读,Dapper 应该对 SQL 更友好,但实体框架 (EF) 允许使用原始 SQL。我通常使用 SQL,但我喜欢 EF 中的一些东西。我的许多查询都相当复杂,涵盖了多个数据库和数据库引擎,而且大多数不仅仅是简单的 CRUD。
在使用 SQL 时,处理对象的方式有什么不同?当我发出查询时,如果返回某些内容并将其分配给 <dynamic>
List
类型,它们是否相同?
我正在使用 ASP.NET Core 1.x。
【问题讨论】:
我有点好奇你如何“喜欢 EF 中的一些东西”? EF是一个包罗万象的画面。您设法隔离并喜欢了哪些小细节? 在性能方面,EF Core 2 和 Dapper 没有以前那么大的区别了:medium.com/@engr.mmohsin/… 【参考方案1】:两者之间可能存在一些性能差异,但使用原始 SQL 查询时,两者都会以相同的方式填充您的 IList(无论如何)。如果您打算为大多数/所有数据库交互编写自己的复杂 SQL,那么 dapper 可能是您更好的选择,因为它不会带来 EF 的所有开销。另一方面,如果您想利用代码优先迁移、更改跟踪等功能,或者您打算在代码(而不是原始 SQL)中完成大部分数据库工作,那么 EF 是有意义的。
也就是说,你最好的选择可能是花一点时间在两者上。您可能会发现,一旦开始与他们一起玩,您很快就会做出决定。
【讨论】:
【参考方案2】:如果您使用 EF 发出 SQL 请求,那么您并没有真正使用 EF。这些调用逐行等效于 ADO,并且您可以定义和维护的结果对象的加载是微不足道的。很多人使用 EF,但在他们想要执行原始 SQL 的时候使用 Dapper。 Dapper 缓存结果集到 POCO 的映射,因此后续查询运行得更快。我不认为EF这样做。 Dapper 中的参数处理也好多了。
但是您仍然被字符串文字中的 SQL 所困扰,每个错误都是运行时错误,您必须编写和维护结果 POCO。我认为如果你使用QueryFirst(免责声明:我写的),你会更快乐,活得更久。 .sql 文件中的 SQL,在您键入时验证语法。您的 POCO 在设计时根据您的查询结果生成。您的查询不断进行集成测试,numerous other benefits 我很快就会记录下来!
【讨论】:
以上是关于在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
为啥实体框架在直接选择语句中的执行速度比 Dapper 快 [关闭]