4

我试图弄清楚如何在VB.NET下的 LINQ 查询中使用 Group Joins 。出于某种原因,我似乎在语法上找到的每个示例都是完全错误的!至少,这是我的编译器一直告诉我的。我在这里到底做错了什么?

这是一个简单的示例,我想将订单加入到他们的订单项中,以便最终得到一个类型,该类型包含按他们的 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”的定义。

4

3 回答 3

5

在 VB 中,Into 别名必须是“Group”而不是 myOrders。使用北风,您可以如下陈述您的查询:

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
于 2011-10-18T18:10:02.630 回答
3

你很近。您只需要指定myOrdersGroup

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()

您可以从这个 MSDN 页面中看到类似的示例,包括如何获取组的CountIntroduction to LINQ in Visual Basic

于 2011-10-18T18:04:58.967 回答
0

我喜欢包含另一个 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()
于 2018-09-05T20:42:05.433 回答