在 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 快 [关闭]

ORM框架之------Dapper,Net下无敌的ORM

dapper可以商用吗

C# Dapper基本三层架构使用 (架构关系)

ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架

ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架