我想弄清楚如何在VB.NET下使用LINQ查询中的组连接。出于某种原因,我似乎在语法上找到的每个例子都是完全错误的!至少,这是我的编译器一直告诉我的。我到底做错了什么?
这是一个简单的例子,我想将订单与其订单项连接起来,这样我最终得到一个类型,该类型包含了按订单项的orderId分组在一起的订单项集合:
Dim groupedOrders = (From o In orders
Group Join i In orderItems On o.OrderId Equals a.OrderId Into myOrders
Select o.OrderId, myOrders).ToList()
我目前在这个例子中遇到的是'myOrders'组我正在创建错误:
方法'myOrders'的定义在这个上下文中是不可访问的。
在VB中,Into别名需要是"Group"而不是myOrders。使用northwind,你可以这样陈述你的查询:
Dim groupedOrders =
From o On Orders
Group Join od in Order_Details On o.OrderID Equals od.OrderID Into Group
Select o.OrderID, Details = Group
如果你想把这个组别名为其他东西,你可以使用:
Dim groupedOrders =
From o On Orders
Group Join od in Order_Details On o.OrderID Equals od.OrderID Into GroupedDetails = Group
Select o.OrderID, GroupedDetails
也就是说,如果您的订单和orderItems来自数据库提供者,您可以只使用自然关联,根本不需要连接:
Dim groupedOrders =
From o In Orders
Select o.OrderID, Details = o.Order_Details
同样,如果您只需要按外键分组,则不需要父表:
Dim groupedOrders =
From od In Order_Details
Group od By Key = od.OrderID Into Group
select Key, Group
你很接近了。您只需要将myOrders
指定为Group
:
Dim groupedOrders = (From o In orders
Group Join i In orderItems On o.OrderId Equals a.OrderId
Into myOrders = Group
Select o.OrderId, myOrders).ToList()
你可以看到类似的例子,包括如何获得组的Count
,从这个MSDN页面:Introduction to LINQ in Visual Basic
我想包含另一个LINQ查询的例子,如果不是为了回答这个问题,那么只是为了保留一个副本,我可以在将来参考:
Dim result As List(Of Reception_Users)
result = (From recept In MyBase.QueryGlobalStatic(Of HACRECEP)(Function(x) True)
Join sys In MyBase.QueryGlobalStatic(Of SYSESSIO)(Function(x) True) On recept.IdLocking Equals sys.Id
Join SYUSRG In MyBase.QueryGlobalStatic(Of SYUser)(Function(x) True) On sys.cle_user Equals SYUSRG.Id
Group By SYUSRG.Code, SYUSRG.Nom, SYUSRG.Prenom
Into Groupuser = Group
Select New Reception_Users With
{
.CodeUsager = Code,
.Nom = Nom,
.Prenom = Prenom
}).ToList()
其中MyBase.QueryGlobalStatic()是一个来自我的上下文的函数,以便允许我将这种代码放在任何地方,而无需检查连接或身份验证数据(以及其他事情)。等效的是:
result = (From recept In dbContext.HACRECEPs
Join sys In dbContext.SYSESSIOs On recept.IdLocking Equals sys.Id
Join SYUSRG In dbContext.SYUsers On sys.cle_user Equals SYUSRG.Id
Group By SYUSRG.Code, SYUSRG.Nom, SYUSRG.Prenom
Into Groupuser = Group
Select New Reception_Users With
{
.CodeUsager = Code,
.Nom = Nom,
.Prenom = Prenom
}).ToList()