2

我在 SQL 设置中有 2 个视图:

  • 采购订单
  • PurchaseOrderLineItems

这些有许多列别名(他们查看/加入的表的名称不合理......这是第 3 方产品)

我有 2 节课(简化如下)

    class PurchaseOrder
    {
        public string PoNumber { get; set; }
        public string Vendor { get; set; }
        public DateTime DateCreated { get; set; }

        public IEnumerable<PurchaseOrderLineItems> LineItems { get; set; }
    }

    class PurchaseOrderLineItems
    {
       public string PoNumber { get; set; }
       public string Name { get; set; }
       public double Price { get; set; }
    }

我正在使用 Linq to Sql - 带有 XML 映射文件(在 sqlmetal.exe 的帮助下创建)

我想要做的是使用 PurchaseOrderLineItem 视图中的记录有效地填充 PurchaseOrder 中的 IEnumerable - 有效地加入表

我想使用 POCO 来做到这一点 - 无需将 EntitySet<> 添加到我的类中,因为最终,我会将我的 ORM 更改为类似 nHibernate 的东西(我相信它有 bag 属性......?)

目前,我有一个存储过程 - sp_getPurchaseOrderLineItems 接受 PONumber,然后返回 PurchaseOrderLineItem 对象列表,然后我将其添加到我的结果集中(这远非理想)

有什么办法可以做我需要的吗?所以基本上,对 PurchaseOrder 的查询会返回实例中已经填充的 LineItems 的 IEnumerable?

值得一提的是,这只会是只读的,我们永远不会使用它来插入/更新数据。

4

2 回答 2

2

您可以扩展您的 PurchaseOrder 类来实现 OnLoadedMethod:

public partial class PurchaseOrder 
{
    partial void OnLoaded()
    {
        LineItems = FunctionToCall_sp_getPurchaseOrderLineItems_AndBuildSet();
    }
}

当您获得采购订单时,这至少会自动获得行项目。

于 2009-10-13T16:26:44.337 回答
0

这就是 n+1 问题。nHibernate 对此有一个解决方案,称为 join-fetch 查询。它基本上做的是订单和订单行之间的外连接查询,这将导致两个表的行数的乘积。

我不认为 Linq2SQL 确实有解决方案。但是您仍然可以使用您的存储过程来生成连接提取输出,并使用一些 Linq2Objects 代码来区分结果中的唯一订单和订单行。

于 2009-10-13T16:42:07.060 回答