2010-05-10 32 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