VB.Net Linq InvalidCastException для Group By - PullRequest
0 голосов
/ 12 декабря 2010

У меня есть запрос Linq Group By, который работает. Вот запрос:

        Dim query = From fb As Feedback In lst Where fb.Seller.login_name.ToLower = UserName.ToLower
                    Order By fb.transaction_id Descending, fb.creation Descending _
                    Group fb By fb.transaction_id _
                    Into Group

Мне не нравится работать с анонимными типами, поэтому я пытаюсь отменить результат и нажимаю InvalidCastException .

Вот информация о типе:

Debug.Print(query.GetType.ToString)

Возвращает:

System.Linq.GroupedEnumerable`4[Feedback,System.Nullable`1[System.Int32],Feedback,VB$AnonymousType_0`2[System.Nullable`1[System.Int32],System.Collections.Generic.IEnumerable`1[Feedback]]]

и внутренний тип:

Debug.Print(item.GetType.ToString)

Возвращает:

VB$AnonymousType_0`2[System.Nullable`1[System.Int32],System.Collections.Generic.IEnumerable`1[Feedback]]

Итак, вооружившись этой информацией, вот используемая декларация:

Dim query As IEnumerable(Of IGrouping(Of Int32?, IEnumerable(Of Feedback)))

Вот возвращенная ошибка:

Unable to cast object of type 'System.Linq.GroupedEnumerable`4[Feedback,System.Nullable`1[System.Int32],Feedback,VB$AnonymousType_0`2[System.Nullable`1[System.Int32],System.Collections.Generic.IEnumerable`1[Feedback]]]' to type 'System.Collections.Generic.IEnumerable`1[System.Linq.IGrouping`2[System.Nullable`1[System.Int32],System.Collections.Generic.IEnumerable`1[Feedback]]]'.

Уродливое решение - определить объект и просмотреть результаты следующим образом:

Class FeedbackDataItem

    Sub New(ByVal transaction_id As Integer)
        _transaction_id = transaction_id
        _feedbacks = New Feedbacks(Of Feedback)
    End Sub

    Private _transaction_id As Integer
    Public Property transaction_id() As Integer
        Get
            Return _transaction_id
        End Get
        Set(ByVal value As Integer)
            _transaction_id = value
        End Set
    End Property

    Private _feedbacks As Feedbacks(Of Feedback)
    Public Property Feedbacks() As Feedbacks(Of Feedback)
        Get
            Return _feedbacks
        End Get
        Set(ByVal value As Feedbacks(Of Feedback))
            _feedbacks = value
        End Set
    End Property

End Class

А для загрузки коллекции:

    Dim FeedbackData As New List(Of FeedbackDataItem)

    For Each item In query
        Dim fbi As New FeedbackDataItem(item.transaction_id)
        fbi.Feedbacks.AddRange(item.Group)
        FeedbackData.Add(fbi)
    Next

Я озадачен тем, почему я получаю эту ошибку. Было бы лучше просто определить результаты и выполнить их повторно, а не обрабатывать данные вручную. Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

Результатом вашего запроса является IEnumerable (анонимного типа).Если вы не хотите, чтобы он был анонимным, вам нужно строго ввести его.

Один из способов - использовать синтаксис метода расширения для группы:

    Dim feedbacks As IEnumerable(Of Feedback) = 
        From fb As Feedback In lst Where fb.Seller.login_name.ToLower = username.ToLower
        Order By fb.transaction_id Descending, fb.creation Descending

    Dim grouped As IEnumerable(Of IGrouping(Of Integer?, Feedback)) = 
         feedbacks.GroupBy(Function(fb) fb.transaction_id)
1 голос
/ 12 декабря 2010

Поместите выбор в конец оператора, чтобы получить его в любом типе, который вы хотите.

Dim query = From fb As Feedback In lst _
            Where fb.Seller.login_name.ToLower = UserName.ToLower
            Order By fb.transaction_id Descending, fb.creation Descending _
            Group gr By fb.transaction_id
            Into Group
            Select new FeedbackDataItem with {
                .transaction_id = gr.transaction_id, _
                .FeedBacks = ...
            }
...