【问题标题】:Which .net ORM can deal with this scenario哪个 .net ORM 可以处理这种情况
【发布时间】: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。

标签: .net orm


【解决方案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 来实现特定功能。这可能是其中之一。您可以将此信息放入存储过程中,并将对象作为参数传递。

      【讨论】:

        猜你喜欢
        • 2019-08-06
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 2011-06-10
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多