Я пытался получить доступ к данным, возвращенным из динамического запроса 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