Использование LINQ Group Joins в VB.NET - PullRequest
3 голосов
/ 18 октября 2011

Я пытаюсь выяснить, как использовать групповые объединения в запросах LINQ в VB.NET .По какой-то причине каждый пример с синтаксисом, который я нашел, просто НЕПРАВИЛЬНЫЙ!По крайней мере, так говорит мне мой компилятор.Что именно я здесь делаю не так?

Это простой пример, где я хочу объединить заказы с их элементами заказов, чтобы я получил тип, содержащий коллекцию элементов заказов, сгруппированных поих 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 'не доступен в этом контексте.

Ответы [ 3 ]

4 голосов
/ 18 октября 2011

В 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
2 голосов
/ 18 октября 2011

Ты рядом.Вам просто нужно обозначить 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: Введение в LINQв Visual Basic .

0 голосов
/ 05 сентября 2018

Я хотел бы включить еще один пример запроса 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...