Nhibernate 为什么CQRS查询端不使用ORM

Nhibernate 为什么CQRS查询端不使用ORM,nhibernate,domain-driven-design,cqrs,Nhibernate,Domain Driven Design,Cqrs,我从博客上读到了格雷格·杨的文章。我看到这个查询正在从数据库中获取数据。我们使用查询DTO对象来填充UI屏幕。建议使用包含普通SQL查询的薄层。不建议使用ORM工具,如Nhibernate或EF。因为它们使用延迟加载,所以在数据库上运行多个查询。 例如,我有一个订单屏幕。这应该是显示订单信息和订单行项目 public class OrderDto{ public string Name {get; set;} public string Date {get; set;} pu

我从博客上读到了格雷格·杨的文章。我看到这个查询正在从数据库中获取数据。我们使用查询DTO对象来填充UI屏幕。建议使用包含普通SQL查询的薄层。不建议使用ORM工具,如Nhibernate或EF。因为它们使用延迟加载,所以在数据库上运行多个查询。

例如,我有一个订单屏幕。这应该是显示订单信息和订单行项目

public class OrderDto{
   public string Name {get; set;}
   public string Date {get; set;}
   public IEnumerable<OrderLineItem> {get; set;}
}
公共类OrderDto{
公共字符串名称{get;set;}
公共字符串日期{get;set;}
公共IEnumerable{get;set;}
}

要创建一个OrderDto实例,我应该向Orders表发送一个查询,然后向OrderLines表发送一个查询。我认为ORM工具也会做同样的事情。那么,为什么要使用纯SQL和新的精简层呢?

我不知道您所指的具体博客文章或引用,所以我无法直接解决这个问题

然而,ORM的缺点是,许多项目使用相同的对象,将ORM用于查询和命令。因此,如果您使用订单对象进行保存(命令),然后希望在屏幕上显示订单列表,并通过获取订单对象列表(查询)来执行此操作,那么您可能没有遵守CQR的基本原则

另一方面,如果您使用EF Order对象进行保存,但使用EF Linq查询投影到OrderDTO列表上,我认为没有人会反对您使用EF(或任何ORM)。

“[…]因为它们使用延迟加载,所以在数据库上运行多个查询。[…]”
不,你可以告诉你最喜欢的ORM不要使用延迟加载。在这种情况下,很可能会执行两个查询,这正是您在示例中指定的方式。

顺便说一句,关键是,因为您有两个独立的命令和查询模型,所以您不必使用ORM来查询数据存储,因此如果您想优化查询服务,就不应该使用ORM。
相反,ORM的好处在命令端更加明显

我不确定使用纯SQL的原因是什么,因为问题中没有包含特定的博客帖子

在您的示例中,不需要两个不同的查询来获取订单和订单行。通常,您可以使用一个连接了两个表(order和orderline)的查询,NHibernate支持这两个表


当您使用像NHibernate这样的ORM时,它支持做得更好,使用像QueryOver/HQL这样的特性,您可以直接填充DTO,同时只从数据库中获取所需的列。在这种情况下,延迟加载不起作用。

我认为一次往返就足以获得订单和订单行。