2010-05-10 81 views
3

我正在使用一個OMS,每個記錄最多可存儲三個項目數據庫中的數據。LINQ正常化數據

以下是包含五個訂單項的訂單示例。

Order Header 
Order Detail 
    Prod 1 
    Prod 2 
    Prod 3 
Order Detail 
    Prod 4 
    Prod 5 

單訂單標題記錄和兩個明細記錄。

我的目標是對於詳細記錄(即每個訂單項的一個明細記錄)具有一對一的關係。在過去,我使用了一條UNION ALL SQL語句來提取數據。使用LINQ有沒有更好的方法解決這個問題?

下面是我第一次嘗試使用LINQ。任何反饋意見,建議或建議將非常感激。對於我讀過的內容,UNION聲明可以對流程徵稅?

var orderdetail = 
    (from o in context.ORDERSUBHEADs 
     select new { 
      edpNo = o.EDPNOS_001, price = o.EXTPRICES_001, 
      qty = o.ITEMQTYS_001 } 
    ).Union(from o in context.ORDERSUBHEADs 
     select new { edpNo = o.EDPNOS_002, price = o.EXTPRICES_002, 
      qty = o.ITEMQTYS_002 } 
    ).Union(from o in context.ORDERSUBHEADs 
     select new { edpNo = o.EDPNOS_003, price = o.EXTPRICES_003, 
      qty = o.ITEMQTYS_003 }); 
+0

「E ..._ 00n」名稱是否以該形式修復?如果少於三個,會發生什麼? 'null'值? – tzaman 2010-05-10 18:33:24

+0

是的,表格列用_00n固定。模式已從支持數據類型的HPe3000 IMAGE數據庫遷移爲陣列。項目級別的細節存儲在數組中。如果只有一個訂單項,則其他兩個值的項目ID將爲零。這同樣適用於價格和數量。沒有機會產生空值。這些列的默認值爲零或空格。所有這一切背後的原因是爲了節省空間。設計師採用訂單中最常見的訂單項數量並創建訂單明細模式。 謝謝, Brennan – 2010-05-10 19:41:51

回答

1

標識構建一個簡單的子類

class Record 
{ 
    public object SubHeading { get; set; } 
    public int EdpNo { get; set; } 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 

然後你只需在它所有環路

var orders = context.ORDERSUBHEADs.Select(o => 
    new Record[] { 
     new Record { SubHeading = o, EdpNo = o.EDPNOS_001, Price = o.EXTPRICES_001, Quantity = o.ITEMQTYS_001 }, 
     new Record { SubHeading = o, EdpNo = o.EDPNOS_002, Price = o.EXTPRICES_002, Quantity = o.ITEMQTYS_002 }, 
     new Record { SubHeading = o, EdpNo = o.EDPNOS_003, Price = o.EXTPRICES_003, Quantity = o.ITEMQTYS_003 } 
    } 
); 

IEnumerable allOrders = IEnumerable.Empty; 
foreach(Record[] r in orders) 
    allOrders = allOrders.Concat(r); 

IEnumerable allRecords = allOrders.Cast<Record>(); 

但坦率地說你o結構很爛,你應該建立項目清單,一個IEnumerableIList什麼的,而不是#Parameters * #Rows

+0

你指的是數據庫模式? – 2010-05-11 17:04:31