2017-01-15 5 views
0

Я пытаюсь присоединиться к 2 таблицам с сервера sql, используя linq to sql в проекте веб-API vb.net.Код ошибки: BC30456 'idno' не является членом 'IEnumerable (Of pt)'

Я пробовал это, но он не работал.

Dim query = (From pt In db.pt 
      Join pt_v In db.pt_v On pt_v.paid Equals pt.paid 
      Where pt.paid.Contains(no1) And pt.name.Contains(no2) 
      Group pt By pt.paid Into grouped = Group 
      Select grouped.idno, grouped.age, grouped.name) 

Но 'группироваться' подчеркнут красным изречение:

Код ошибки: 'IDNO' BC30456 не является членом 'IEnumerable (Of кегля).

И на каждой петле:

For Each item In query 

'запрос' также подчеркнуты красным поговорку:

Expression имеет тип, который не является типом коллекции '?'.

ОБНОВЛЕНО v1

Dim query = From pt In db.pt.GroupBy(Function(d) d.paid) 
          Join p_v In db.p_v On p_v.paid Equals pt.Key 
          Where p_v.paid.Contains(no1) 
          Select New With { 
           .idno = p_v.idno, 
           .age = p_v.age, 
           .name = p_v.name 
           } 

До сих пор не существует красный подчеркивание под любым переменным, но я не смог отобразить только один из IDNO. И в разделе «select new with» я не мог получить доступ к значениям pt, если я не использую pt.ToList, но когда я это делаю, он отображает записи 300000 ++. Мне жаль, что я раньше не объяснял достаточно. Когда я попытался получить доступ к значениям из таблицы пт,

Select New With { 
        .idno = p_v.idno, 
        .age = pt.age, 
        .name = pt.name 
       } 

pt.name подчеркнут красным сказать «имя не является членом IGrouping (Of ​​String, пт)»

Что я надеюсь является когда я выбрать для отображения значения базы данных на основе no1, скажу IDNO имеет 3 записи с одинаковым IDNO,

{.idno = 1, .age = 10, .name = someone} 
{.idno = 1, .age = 12, .name = someone2} 
{.idno = 1, .age = 13, .name = someone3} 

..Эт только отображает один из 3.

{.idno = 1, .age = 10, .name = someone} 

ОБНОВЛЕНО v2

Это то, что я сделал. Я отменил расположение таблиц, потому что я хотел направить больше полей из таблицы pt_v.

Dim query = From pt_v In db.pt_v.GroupBy(Function(d) d.paid) 
        Join pt In db.pt On pt.paid Equals pt_v.Key 
        Where pt_v.Key.Contains(no1) Or pt.pname.Contains(no2) 
        Select New With { 
           .idno = pt.idno, 
           .age = pt.age, 
           .name = pt.name, 
           .fod = pt_v.FirstOrDefault() 'ok 
           .pri = pt_v.Key 'only .Key worked for accessing field from pt_v table 
           .status = pt_v.status, 'underlined red 
           } 

Там нет никаких проблем, когда я добавил .fod и .При, но .status не принято говоря

'статус не является членом IGrouping (Of ​​String, пт)'

+0

@ Jinx88909 пробовал. теперь idno, возраст и имя больше не подчеркнуты красным цветом, но сгруппированные подчеркнуты красным, говоря: BC36594 Определение метода «сгруппировано» в этом контексте недоступно – Nurul

+0

@ Jinx88909 Я хотел бы, чтобы это было так же просто, как «... Группа pt By pt.paid ... ', но когда я это сделал, произошла ошибка BC36615' Into ', ожидаемая – Nurul

+0

@ Jinx88909 скобки, которые я забыл удалить из try .distinct(). извините, но я в замешательстве. Что вы имеете в виду и как ссылаться на поля? – Nurul

ответ

1

Вы должны уточнить свое сообщение и добавить дополнительную информацию о входных данных (таблицах), а также о том, что вы ожидаете в результате.

Я не могу понять, о чем вы просите, но я уверен, что вам нужно больше узнать о linq.

Может быть, этот пример поможет вам понять, как присоединиться и группы по делам:

Module Module1 

    Sub Main() 
     Dim orders As New List(Of Order) From { 
      New Order() With {.Id = 1, .Description = "first order"}, 
      New Order() With {.Id = 2, .Description = "second order"} 
     } 

     Dim details As New List(Of OrderDetail) From { 
      New OrderDetail() With {.Id = 1, .OrderId = 1, .ProductId = 1}, 
      New OrderDetail() With {.Id = 2, .OrderId = 1, .ProductId = 3}, 
      New OrderDetail() With {.Id = 3, .OrderId = 2, .ProductId = 100}, 
      New OrderDetail() With {.Id = 4, .OrderId = 2, .ProductId = 15}, 
      New OrderDetail() With {.Id = 5, .OrderId = 2, .ProductId = 55} 
     } 


     Console.WriteLine("first example") 
     Dim orderDetails = From g In details.GroupBy(Function(d) d.OrderId) 
          Join order In orders On order.Id Equals g.Key 
          Select New With {.Order = order, .Details = g.ToList} 

     orderDetails.ToList.ForEach(Sub(orderDetail) 
             Console.WriteLine(orderDetail.Order) 

             orderDetail.Details.ForEach(Sub(detail) 
                     Console.WriteLine(" " & detail.ToString) 
                    End Sub) 

             Console.WriteLine() 
            End Sub) 

     Console.WriteLine() 




     Console.WriteLine("second example") 
     Dim orderDetailsNew = From g In details.GroupBy(Function(d) d.OrderId) 
          Join order In orders On order.Id Equals g.Key 
          Select New With {.Order = order, .Details = New List(Of OrderDetail)() From {g.FirstOrDefault()}} 


     orderDetailsNew.ToList.ForEach(Sub(orderDetail) 
              Console.WriteLine(orderDetail.Order) 

              orderDetail.Details.ForEach(Sub(detail) 
                      Console.WriteLine(" " & detail.ToString) 
                     End Sub) 

              Console.WriteLine() 
             End Sub) 

     Console.WriteLine() 



     Console.WriteLine("third example") 
     Dim orderDetailsNew2 = From g In details.GroupBy(Function(d) d.OrderId) 
          Join order In orders On order.Id Equals g.Key 
          Where order.Id = 1 
          Select New With {.Order = order, .Detail = g.FirstOrDefault()} 

     orderDetailsNew2.ToList.ForEach(Sub(orderDetail) 
              Console.WriteLine(orderDetail.Order.ToString & " " & orderDetail.Detail.ToString) 
             End Sub) 

     Console.ReadLine() 
    End Sub 

    Public Class Order 
     Public Property Id As Integer 
     Public Property Description As String 

     Public Overrides Function ToString() As String 
      Return String.Format("Id: {0}, Description: {1}", Id, Description) 
     End Function 
    End Class 

    Public Class OrderDetail 
     Public Property Id As Integer 
     Public Property OrderId As Integer 
     Public Property ProductId As Integer 

     Public Overrides Function ToString() As String 
      Return String.Format("Id: {0}, OrderId: {1}, ProductId: {2}", Id, OrderId, ProductId) 
     End Function 
    End Class 

End Module 
+0

благодарит за ваш ответ. Это очень аккуратно, и я хорошо понял ваш пример, но на самом деле, на основе вашего примера, я надеялся, что когда я выбрал отображение .OrderId = 1; вместо отображения 2 значений: .ProductId = 1 и .ProductId = 3, он отображает только один. Я попытался добавить предложение where между предложением join и select (я обновил свой вопрос о том, что я сделал), но он по-прежнему отображает оба значения .ProductId. – Nurul

+0

@Nurul Я просто смотрю на это снова, и теперь мне интересно, почему вы «группируете» вообще. Вы хотите показать «Sum» или «Count» чего-либо, так как это будет «Grouping». Если вы просто присоединились к двум классам вместе без «Группы», используйте «Где» для фильтрации ваших результатов, вероятно, вы увидите все записи. Вы также должны присоединиться к 'Ids'. Я не использую то, что 'Paid' в вашем примере, но посмотрите, что сделал Shadow. 'order.Id Equals g.Key'. 'g.Key' ссылки на' d.OrderId' в группировке (оба являются идентификаторами в его классах). – Bugs

+0

@Nurul Я не уверен, что правильно понял, что вы просили, но я попробовал. Пожалуйста, проверьте мой обновленный пример кода после вашего комментария здесь. – shadow

Смежные вопросы