C# Linq到Sql多个一关系
我在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,因
- 采购订单
- PurchaseOrderLineItems
值得一提的是,这将永远是只读的,我们永远不会使用它插入/更新数据。您可以扩展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();
}
}