哪个 .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 可以处理这种情况的主要内容,如果未能解决你的问题,请参考以下文章