C# Linq到Sql多个一关系

C# Linq到Sql多个一关系,c#,linq-to-sql,one-to-many,C#,Linq To Sql,One To Many,我在SQL设置中有两个视图: 采购订单 PurchaseOrderLineItems 它们有许多列的别名(它们查看/连接的表没有合理的名称…这是第三方产品) 我有两门课(简化如下) 我正在使用Linq到Sql-with XML映射文件(在sqlmetal.exe的帮助下创建) 我想做的是使用PurchaseOrderLineItem视图中的记录有效地填充PurchaseOrder中的IEnumerable,有效地连接表 我想使用POCO来实现这一点,而不必在我的类中添加EntitySet,因

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

  • 采购订单
  • PurchaseOrderLineItems
它们有许多列的别名(它们查看/连接的表没有合理的名称…这是第三方产品)

我有两门课(简化如下)

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

我想做的是使用PurchaseOrderLineItem视图中的记录有效地填充PurchaseOrder中的IEnumerable,有效地连接表

我想使用POCO来实现这一点,而不必在我的类中添加EntitySet,因为最终,我会将ORM更改为类似nHibernate的东西(我相信它有bag属性…?)

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

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


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

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

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

这将至少在您收到订单时自动获取行项目。

这是n+1问题。nHibernate对此有一个解决方案,称为连接获取查询。它基本上做的是order和order line之间的外部联接查询,这将导致两个表的行计数的乘积


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

My entities不知道数据层。。。它们位于一个单独的“Company.Entities”项目/程序集中。如果是这样,只需保持集合填充代码不变即可。当你搬到NHibernate时,像这样的东西会随着你的映射而消失。好问题,我会给你一个答案:)谢谢。nHibernates解决方案是我以前在映射文件中看到的元素吗?这是解决方案的一半。另一半是指定nHibernate应该使用连接获取策略来获取数据(包支持的另一种方式是延迟加载策略)。您可以在xml或hql(查询)中指定。看到和
    class PurchaseOrderLineItems
    {
       public string PoNumber { get; set; }
       public string Name { get; set; }
       public double Price { get; set; }
    }
public partial class PurchaseOrder 
{
    partial void OnLoaded()
    {
        LineItems = FunctionToCall_sp_getPurchaseOrderLineItems_AndBuildSet();
    }
}