访问通过动态链接查询返回的匿名类型

时间:2011-09-19 16:35:44

标签: linq dynamic types anonymous

我一直在尝试将动态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

0 个答案:

没有答案