c# - LINQ 规范化数据

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

最佳答案

Id 构建一个简单的子类

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

关于c# - LINQ 规范化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2805157/

相关文章:

c# - 如何从 RichTextBox 控件的撤消堆栈中删除操作?

c# - 如何通过linq从json获取子数据

mysql - 加入 3 个表并从一个表中获取最后更新日期

sql - VB 调用写入文件的 SQL Server 存储过程,故障超过 104 KB

c# - 如何使用 Dynamic LINQ 求和

c# - 无法创建类型的常量值在此上下文中仅支持原始类型或枚举类型

c# - 使用 Glass Mapper for Sitecore 获取内部链接的绝对 Url

c# - C#SIP音频和视频通话

java - <EOF>创建 Derby 表时出现异常

c# - 用于选择特定数据的 LINQ 查询