哪个 .net ORM 可以处理这种情况

Posted

技术标签:

【中文标题】哪个 .net ORM 可以处理这种情况【英文标题】:Which .net ORM can deal with this scenario 【发布时间】:2008-12-19 14:06:59 【问题描述】:

从previous question 处,我了解到 Linq to SQL 不能只急切加载foreingKey 表的某些文件。

所以我想问.net ORM 可以支持哪些类型的语句,包括实体类中的这种类型的语句,只需一个 DB 调用,无需手动将结果与对象映射。

  -- simplified for clarity
  SELECT Order.*, Product.Name, Customer.Name, OrderType.Name, Provider.Name
  FROM Order
      INNER JOIN Product on Order.ProductID = Product.ProductID
      INNER JOIN Customer on Order.CustomerID = Customer.CustomerID
      INNER JOIN OrderType on Order.OrderTypeID = OrderType.OrderTypeID
      INNER JOIN Provider on Order.ProviderID = Provider.ProviderID

我想让它尽可能简单(尽量避免 NHibernate 等)

【问题讨论】:

有趣的是,您试图通过避免 NHibernate 来实现“简单”。虽然 NHibernate 确实有复杂性,但这些都是针对复杂情况的 - 简单的事情真的很简单。 IMO,您添加到项目中的每个外部部件都会增加复杂性。您必须处理补丁和新版本,更不用说学习 NQL 或 HQL。 【参考方案1】:

作为投影的一部分,LINQ-to-SQL 应该可以处理 - 你试过了吗

select new Order = order, ProductName = order.Product.Name,
             CustomerName = order.Customer.Name,
             OrderType = order.OrderType.Name  // etc

如果您希望这些属性成为对象模型本身的一部分...更棘手,并且与实体不太相关。您可以在部分类中添加属性,但您必须执行大量加载选项才能使它们快速加载。实际上,考虑到对象模型的复杂性,这可能不值得。

【讨论】:

【参考方案2】:

DataObjects.Net 以与 LINQ 2 SQL 完全相同的方式处理此问题:

from order in Query<Order>.All
where ...
select new 
  Order = order, 
  ProductName = order.Product.Name,
  CustomerName = order.Customer.Name,
  OrderType = order.OrderType.Name 

【讨论】:

【参考方案3】:

有时您只需要“自己完成工作”,而不是依赖 ORM 来实现特定功能。这可能是其中之一。您可以将此信息放入存储过程中,并将对象作为参数传递。

【讨论】:

以上是关于哪个 .net ORM 可以处理这种情况的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ORM (NHibernate) 中模拟这种情况?

CQRS读端ORM还是纯ADO.NET?

我真的需要 ORM 吗?

哪个 ORM 支持多行更新和删除

ORM 或其他东西可以有效地处理带有 order 列的 SQL 表

哪个 ORM 可以在带有 Oracle 数据库的 .Net Web API 中使用?