Доступ к анонимным типам, возвращаемым через запрос динамической ссылки - PullRequest
1 голос
/ 19 сентября 2011

Я пытался получить доступ к данным, возвращенным из динамического запроса linq, как анонимный тип.Совет, который я нашел, предполагает, что я должен создать собственный тип и использовать его в предложении Select с новым ключевым словом.Я был направлен на следующий вопрос для примера кода:

System.LINQ.Dynamic: Выберите ("new (...)") в список (или любую другую перечисляемую коллекцию).из )

Это был действительно отличный пример, который я включил в свой код (который является VB, поэтому мне пришлось сделать перевод).

Мой код компилируется нормально, но когда я его запускаю, я получаю сообщение об ошибке:

«Значение не может быть нулевым. Имя параметра: member» в следующей строке из примера: bindings [i] = Expression.Bind (type.GetProperty (properties [i] .Name), выражения [i]);

Похоже, это связано с выражениями (i), которые правильно содержат два элемента, так как я возвращаю два поля из таблицы базы данных.Свойства (i) правильно содержит имена этих двух полей.Любые идеи относительно того, что значение для члена должно быть и где его следует найти?Это что-то из базы данных?

Предложение where этого запроса работает, и когда я запускаю его как анонимный тип, он возвращает записи (или, скорее, два поля из записей).Возвращенные поля содержат данные, а не NULL.

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

Очень ценится.

Function ParseNew() As Expression
        NextToken()
        ValidateToken(TokenId.OpenParen, Res.OpenParenExpected)
        NextToken()
        Dim properties As New List(Of DynamicProperty)()
        Dim expressions As New List(Of Expression)()
        Do
            Dim exprPos = tokenVal.pos
            Dim expr = ParseExpression()
            Dim propName As String
            If TokenIdentifierIs("as") Then
                NextToken()
                propName = GetIdentifier()
                NextToken()
            Else
                Dim [me] As MemberExpression = TryCast(expr, MemberExpression)
                If [me] Is Nothing Then Throw ParseError(exprPos, Res.MissingAsClause)
                propName = [me].Member.Name
            End If
            expressions.Add(expr)
            properties.Add(New DynamicProperty(propName, expr.Type))
            If tokenVal.id <> TokenId.Comma Then Exit Do
            NextToken()
        Loop
        ValidateToken(TokenId.CloseParen, Res.CloseParenOrCommaExpected)
        NextToken()
        'CODE added to support strongly-typed returns 
        Dim type As Type = If(newResultType, DynamicExpression.CreateClass(properties))
        Dim bindings(properties.Count - 1) As MemberBinding
        For i As Integer = 0 To bindings.Length - 1
            **bindings(i) = Expression.Bind(type.GetProperty(properties(i).Name), expressions(i))**
        Next
        Return Expression.MemberInit(Expression.[New](type), bindings)
    End Function
...