2009-10-13 74 views
2

我在SQL 2次設置:LINQ to SQL的許多一對一的關係

  • 的PurchaseOrder
  • PurchaseOrderLineItems

都有許多列別名(他們查看/表加入不明智地命名...這是第三方產品)

我有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到SQL - 與XML映射文件(從sqlmetal.exe幫助創建)

我想要做的是用途不同有填充了IEnumerable中的PurchaseOrder來自PurchaseOrderLineItem視圖的記錄 - 有效地加入表格

我想用POCO來做到這一點 - 不必爲我的類添加EntitySet <>,因爲最終,我會將我的ORM更改爲像nHibernate(其中包屬性我相信...?)

目前,我有一個存儲過程 - sp_getPurchaseOrderLineItems它採用PONumber,然後返回PurchaseOrderLineItem對象的列表,然後我將其添加到我的結果集(這是遠,很不理想)

有什麼辦法可以做我需要的嗎?所以基本上,PurchaseOrder上的查詢返回實例中已經填充的LineItems的IEnumerable?

值得一提的是,這隻會是隻讀的,我們永遠不會使用它插入/更新數據。

+0

很酷的問題,我會找到你的答案:) – leppie 2009-10-13 16:37:23

回答

0

這是n + 1問題。 nHibernate爲此提供了一個解決方案,稱爲join-fetch查詢。它的基本功能是在訂單和訂單行之間進行外部聯接查詢,這將導致兩個表的行數的乘積。

我不認爲Linq2SQL確實有解決方案。但是,仍然可以使用存儲過程生成連接提取輸出,並使用一些Linq2Objects代碼將結果中的唯一訂單和訂單行區分開來。

+0

謝謝。 是nHibernates解決方案元素我見過的映射文件之前..? – Alex 2009-10-13 16:51:11

+0

這是解決方案的一半。另一半是指定nHibernate應該使用join-fetch策略來獲取數據(袋子支持的其他方式是延遲加載策略)。您可以在xml或hql(查詢)中指定。請參閱https://www.hibernate.org/315.html和http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins – tofi9 2009-10-14 08:38:15

2

您可擴展PurchaseOrder類實現OnLoadedMethod:

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

這至少會自動獲得行項目,當你得到你的採購訂單。

+0

我的實體不知道數據層... 他們在一個單獨的「Company.Entities」項目/大會。 – Alex 2009-10-13 16:30:16

+1

如果是這樣的話,只要保持收集人口代碼的原樣就行了。 當你轉向NHibernate的時候,這樣的事情會隨着你的映射而消失。 – 2009-10-13 16:34:11