我一直在尝试将动态linq查询返回的数据作为匿名类型进行访问。我发现的建议表明我应该创建一个自定义类型,并在带有new关键字的Select子句中使用它。我被引导到以下问题的代码示例:
System.LINQ.Dynamic: Select(" new (...)") into a List<T> (or any other enumerable collection of <T>)
这确实是一个很好的例子,我将其整合到我的代码中(这是VB所以我不得不做一些翻译)。
我的代码编译得很好但是当我运行它时,我得到错误跟随错误:
“值不能为null。参数名称:member”在示例的以下行中: bindings [i] = Expression.Bind(type.GetProperty(properties [i] .Name),expressions [i]);
这似乎与表达式(i)相关联,正确地包含两个项目,因为我从数据库表中返回两个字段。 properties(i)正确保存这两个字段的名称。关于成员的价值应该是什么以及应该在哪里找到的任何想法?它来自数据库吗?
此查询的where子句有效,当我以匿名类型运行它时,它会带回记录(或者记录中的两个字段)。返回的字段包含非空的数据。
这是我在早期问题中提供的示例中的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