C# LINQ标准化数据
我使用的OMS在数据库中每个记录最多存储三行项目 以下是包含五个行项目的订单示例C# LINQ标准化数据,c#,sql,linq,union,normalize,C#,Sql,Linq,Union,Normalize,我使用的OMS在数据库中每个记录最多存储三行项目 以下是包含五个行项目的订单示例 Order Header Order Detail Prod 1 Prod 2 Prod 3 Order Detail Prod 4 Prod 5 一条订单标题记录和两条详细记录 我的目标是为详细记录建立一对一的关系(即,每行项目一个详细记录)。过去,我使用unionallSQL语句来提取数据。使用LINQ有更好的方法解决这个问题吗 下面是我第一次尝试使用LINQ。如有任何反馈、建议
Order Header
Order Detail
Prod 1
Prod 2
Prod 3
Order Detail
Prod 4
Prod 5
一条订单标题记录和两条详细记录
我的目标是为详细记录建立一对一的关系(即,每行项目一个详细记录)。过去,我使用unionall
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 });
我构建了一个简单的子类
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>();
var orders=context.orderssubheads.Select(o=>
新记录[]{
新记录{SubHeading=o,EdpNo=o.EDPNOS_001,Price=o.EXTPRICES_001,Quantity=o.ITEMQTYS_001},
新记录{SubHeading=o,EdpNo=o.EDPNOS_002,Price=o.EXTPRICES_002,Quantity=o.ITEMQTYS_002},
新记录{SubHeading=o,EdpNo=o.EDPNOS_003,Price=o.EXTPRICES_003,Quantity=o.ITEMQTYS_003}
}
);
IEnumerable allOrders=IEnumerable.Empty;
foreach(订单中记录[]r)
allOrders=allOrders.Concat(r);
IEnumerable allRecords=allOrders.Cast();
但是坦率地说,你的
o
结构糟糕透了,你应该把项目列表构建成IEnumerable
或IList
之类的东西,而不是#参数*#行
是不是E?如果少于三个怎么办<代码>空值
值?是的,表列用_00n固定。架构是从支持数据类型为数组的HPe3000图像数据库迁移而来的。项目级详细信息存储在数组中。如果仅存在一个行项目,则其他两个值的项目ID将为零。这同样适用于价格和数量。不可能出现空值。列的默认值为零或空格。所有这一切背后的理由是为了节省当时的空间。设计师在订单上获取最常见的行项目数,并创建订单详细信息模式。谢谢,你指的是数据库模式吗?