.net 使用LINQ和存储过程获取一对多关系
我有两张桌子:.net 使用LINQ和存储过程获取一对多关系,.net,sql,linq,.net,Sql,Linq,我有两张桌子: tbl_Orders id OrderN DateAdd 1 77-65 01.01.2011 2 77-73 24.01.2011 3 77-82 13.01.2011 4 77-86 15.01.2011 5 77-89 11.01.2011 tbl_OrdersList id OrderId
tbl_Orders
id OrderN DateAdd
1 77-65 01.01.2011
2 77-73 24.01.2011
3 77-82 13.01.2011
4 77-86 15.01.2011
5 77-89 11.01.2011
tbl_OrdersList
id OrderId ItemId
1 1 23
2 1 32
3 3 33
4 5 45
5 5 48
tbl_订单中有订单,tbl_订单列表中的订单中有采购。
因此,系统中有5个订单:
// Orders - get orders from tbl using dataContext and tbl_Orders
foreach(var order in Orders){
foreach(var orderlist in order.OrdersList) {
}
}
Linq2Sql是Linq最薄弱的一环。它生成的SQL对于简单的情况来说是不错的,但当你对代码进行最后润色时,它往往会退化。退化可能是1000倍甚至更糟。这是一个甜蜜的陷阱:一开始很好,但当你的截止日期临近时,它就会变得一团糟
我养成了编写存储过程的习惯。那么。我的问题有什么问题吗?我知道usp通常更好,但我如何将结果映射到Orders和Orders之类的对象。OrdersList?向项目中添加一个DBML文件。将存储过程从服务器资源管理器拖到DBML文件中。这将生成一个带有C#函数的DataContext它将把存储过程映射到一个对象。它将使用自动生成的类型进行映射。我已经找到了一种方法来映射我需要的返回类型。我的问题的答案是属性窗口中的属性“return type”,当您已经将usp拖到dbml方法并单击它时。默认情况下,有自动生成的类型,但我可以将其更改为“Orde”r’型。
Dim q = From o In Orders, ol In OrdersList _
where o.id Equals ol.OrderId Into ords = Group _
From ol In ords.DefaultIfEmpty _
Select New With {o.OrderN, o.DateAdd,ords.ItemID}