LINQ规范化数据

时间:2010-05-10 18:05:11

标签: c# sql linq union normalize

我使用的OMS在数据库中每条记录最多可存储三个订单项。

以下是包含五个订单项的订单示例。

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 });

1 个答案:

答案 0 :(得分: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